【发布时间】:2011-04-20 07:30:59
【问题描述】:
我相信 Erlang 社区并不羡慕 Node.js,因为它本身就提供非阻塞 I/O,并且可以轻松地将部署扩展到多个处理器(Node.js 中甚至没有内置的东西)。更多详情请访问http://journal.dedasys.com/2010/04/29/erlang-vs-node-js 和Node.js or Erlang
Haskell 呢? Haskell 能否提供 Node.js 的一些好处,即无需求助于多线程编程即可避免阻塞 I/O 的干净解决方案?
Node.js 有很多吸引人的地方
- 事件:无线程操作,程序员只提供回调(如在 Snap 框架中)
- 回调保证在单线程中运行:不可能出现竞争条件。
- 漂亮而简单的 UNIX 友好 API。奖励:出色的 HTTP 支持。 DNS 也可用。
- 默认情况下,每个 I/O 都是异步的。这使得更容易避免锁定。但是,回调中过多的 CPU 处理会影响其他连接(在这种情况下,任务应拆分为更小的子任务并重新调度)。
- 客户端和服务器端的语言相同。 (不过,我看不出这个有太多价值。jQuery 和 Node.js 共享事件编程模型,但其余的却非常不同。我只是看不出如何在服务器端和客户端之间共享代码在实践中很有用。)
- 所有这些都打包在一个产品中。
【问题讨论】:
-
我认为你应该在Programmers 上问这个问题。
-
不包含一段代码并不构成主观问题。
-
我对 node.js 了解不多,但是你的问题让我印象深刻:为什么你觉得线程的前景如此不愉快?线程应该是多路复用 I/O 的正确解决方案。我在这里广泛使用术语线程,包括 Erlang 的进程。也许您担心锁和可变状态?您不必这样做 - 如果对您的应用程序更有意义,请使用消息传递或事务。
-
@gawi 我不认为这听起来很容易编程 - 如果没有抢占,你必须处理饥饿和长延迟的可能性。基本上,线程是 Web 服务器的正确抽象——不需要处理异步 I/O 以及随之而来的所有困难,只需在线程中完成即可。顺便说一句,我写了一篇关于 Haskell 中 Web 服务器的论文,你可能会觉得很有趣:haskell.org/~simonmar/papers/web-server-jfp.pdf
-
"回调保证在单线程中运行:不可能出现竞争条件。"错误的。您可以轻松地在 Node.js 中设置竞争条件;只需假设一个 I/O 操作将在另一个 I/O 操作之前完成,然后 BOOM。 是确实不可能的是一种特殊的竞争条件,即并发非同步访问内存中的同一字节。
标签: multithreading haskell concurrency node.js