好的,在观看了@gawi指向我的一些node.js演示文稿之后,我可以多说一点Haskell与node.js进行比较的情况。在演示中,Ryan描述了Green
Threads的一些好处,但是接着说,他认为缺少线程抽象并不是不利条件。我不同意他的立场,尤其是在Haskell的情况下:我认为线程提供的抽象对于使服务器代码更容易正确使用和更健壮至关重要。特别是:
每个连接使用一个线程可使您编写表示与单个客户端进行通信的代码,而不是编写同时处理 所有 客户端的代码。可以这样认为:一台处理带有线程的多个客户端的服务器看起来与处理一个客户端的服务器几乎相同;主要区别在于
fork
前者中有某个地方。如果您要实现的协议非常复杂,则同时管理多个客户端的状态机将变得非常棘手,而线程使您仅可以编写与单个客户端的通信脚本。该代码更容易正确使用,也易于理解和维护。单个OS线程上的回调是协作式多任务处理,而不是抢先式多任务处理,这是线程获得的。协作式多任务处理的主要缺点在于,程序员负责确保没有饥饿。它失去了模块化:在一个地方犯一个错误,它会破坏整个系统。这确实是您不需要担心的事情,而抢占是简单的解决方案。此外,回调之间的通信是不可能的(这将导致死锁)。
在Haskell中并发并不困难,因为大多数代码是纯净的,因此构造时线程安全的。有简单的通信原语。与使用无限制副作用的语言相比,在Haskell中并发射击自己要困难得多。



