Multithreading Haskell对Node.js的响应是什么?
我相信Erlang社区并不羡慕Node.js,因为它以本机方式进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(Node.js中甚至没有内置)。更多详情请访问和 哈斯克尔呢?Haskell能否提供Node.js的一些好处,即一个干净的解决方案,避免阻塞I/O,而无需求助于多线程编程Multithreading Haskell对Node.js的响应是什么?,multithreading,haskell,concurrency,node.js,Multithreading,Haskell,Concurrency,Node.js,我相信Erlang社区并不羡慕Node.js,因为它以本机方式进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(Node.js中甚至没有内置)。更多详情请访问和 哈斯克尔呢?Haskell能否提供Node.js的一些好处,即一个干净的解决方案,避免阻塞I/O,而无需求助于多线程编程 Node.js有很多吸引人的地方 事件:没有线程操作,程序员只提供回调(在Snap框架中) 回调保证在单个线程中运行:不可能存在争用条件 漂亮简单的UNIX友好API。好处:出色的HTTP支持。DNS也可用
Node.js有很多吸引人的地方
- 您可以在显式轻量级线程中编程(例如,一台笔记本电脑上有数百万个线程)
- 或;您可以基于可伸缩的事件通知,以异步事件驱动的方式编程
- 大量地
- 并发集合
- 对分析和调试的工具支持
- 高性能
- 有趣的用户:
描述实现。好的,看了一下@gawi给我指出的内容,我可以再多说一点Haskell和node.js的比较。在演示中,Ryan描述了绿色线程的一些好处,但接着说,他不认为缺少线程抽象是一个缺点。我不同意他的观点,特别是在Haskell的背景下:我认为线程提供的抽象对于使服务器代码更容易正确、更健壮至关重要。特别是:
- 使用每个连接一个线程,可以编写表示与单个客户机通信的代码,而不是编写同时处理所有客户机的代码。可以这样想:使用线程处理多个客户机的服务器看起来与处理单个客户机的服务器几乎相同;主要区别在于前者的某处有一个
。如果您要实现的协议非常复杂,那么同时管理多个客户端的状态机会变得非常棘手,而线程只允许您编写与单个客户端的通信脚本。代码更容易正确,更容易理解和维护fork
- 单个操作系统线程上的回调是协作多任务处理,而不是抢占式多任务处理,这是通过线程实现的。协作多任务处理的主要缺点是程序员负责确保没有饥饿。它失去了模块性:在一个地方出错,它可能会破坏整个系统。这真的是你不想担心的事情,抢先是一个简单的解决方案。此外,回调之间的通信是不可能的(这将导致死锁)
- 并发在Haskell中并不难,因为大多数代码都是纯代码,因此通过构造是线程安全的。有一些简单的通信原语。在Haskell中,用并发的方式射中自己的脚要比用无限制副作用的语言来射中自己的脚困难得多
回调保证在单个线程中运行:不可能存在争用条件 在node.js中仍然可能存在竞争条件,但这更困难 每个请求都在它自己的线程中。当您编写必须与其他线程通信的代码时,由于haskell的并发原语,使其成为线程安全的代码非常简单 漂亮简单的UNIX友好API。好处:出色的HTTP支持。DNS也可用 看看hackage,自己看看 默认情况下,每个I/O都是异步的(但有时这会让人恼火)。这样更容易避免锁定。但是,回调中过多的CPU处理将影响其他连接(在这种情况下,任务应拆分为较小的子任务并重新调度) 如果您没有这些问题,ghc将把您的工作分配给真正的OS线程 cl使用相同的语言