我相信Erlang社区并不嫉妒Node.js,因为它以本机方式进行非阻塞I/O,并且有多种方法可以轻松地将部署扩展到多个处理器(Node.js中甚至没有内置的东西).更多详情请参见http://journal.dedasys.com/2010/04/29/erlang-vs-node-jsNode.js or Erlang

哈斯克尔呢?Haskell能否提供Node的一些好处.js是一个干净的解决方案,可以避免阻塞I/O,而无需求助于多线程编程?


Node有很多吸引人的地方.js

  1. 事件:没有线程操作,程序员只提供回调(在Snap框架中)
  2. 回调保证在单个线程中运行:不可能存在竞争条件.
  3. 漂亮简单的UNIX友好API.好处:出色的HTTP支持.DNS也可用.
  4. 默认情况下,每个I/O都是异步的.这样更容易避免锁.但是,回调中的CPU处理过多会影响其他连接(在这种情况下,任务应该拆分为更小的子任务并重新安排).
  5. 客户端和服务器端使用相同的语言.(不过,我看不出这一点有多大价值.jQuery和Node.js共享事件编程模型,但其余的都非常不同.我只是看不出在服务器端和客户端之间共享代码在实践中有什么用处.)
  6. 所有这些都打包在一个产品中.

推荐答案

好的,在看了@gawi给我指出的node.js presentation个例子之后,我可以说更多关于Haskell和node的比较.js.在演示中,Ryan描述了绿色线程的一些好处,但他接着说,他不认为缺乏线程抽象是一个缺点.我不同意他的观点,尤其是在Haskell的背景下:我认为线程提供的抽象对于使服务器代码更容易正确、更健壮至关重要.特别地:

  • 使用每个连接一个线程,可以编写代码来表示与单个客户机的通信,而不是编写同时处理这些客户机的代码.可以这样想:使用线程处理多个客户机的服务器看起来与处理单个客户机的服务器几乎相同;主要区别在于前者的某个地方有一个fork.如果您要实现的协议非常复杂,那么同时管理多个客户端的状态机会变得非常棘手,而线程只允许您编写与单个客户端的通信脚本.代码更容易正确,更容易理解和维护.

  • 单个OS线程上的回调是协作式多任务处理,而不是抢占式多任务处理,这是线程的结果.协作式多任务处理的主要缺点是程序员负责确保没有饥饿.它失go 了模块性:在一个地方出错,可能会毁掉整个系统.这真的是你不想担心的事情,先发制人是一个简单的解决方案.此外,回调之间的通信是不可能的(这将导致死锁).

  • 在Haskell中,并发并不难,因为大多数代码都是纯代码,因此通过构造是线程安全的.有一些简单的通信原语.在Haskell中,并发地射中自己的脚要比在一种有着不受限制的副作用的语言中困难得多.

Node.js相关问答推荐

Express 4.18正文解析

通过 Node js 中的 TBA 执行 netsuite REST upsert 操作出现 401 错误

Mongodb - 在数组数组中查找()

Solidity 将数据位置从内存更改为存储

如何使用包含条件正确分页的 sequelize 查询?

将文件传递到 AWS lambdas(nodejs) + API 网关后重新上传文件

如何在没有云功能的情况下使用 Google PubSub

错误:找不到模块'C:\Users\nguye\AppData\Local\nodejs\node_modules\npm\bin\npm-cli.js'

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

MongoDB Atlas中的聚合触发器不起作用

JavaScript & Node - 将图像文件保存到服务器但无法查看

响应发送 200 而不是 403

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

Passport 登录和持久会话

使用 Webpack 和 font-face 加载字体

node.js 模块和函数中this的含义

使用 pm2 编程 api 重命名进程

node.js 中存储的模块变量在什么范围内?

Selenium WebDriver 等到元素显示

使用 Node-sass 缩小 CSS