Multithreading Haskell对Node.js的响应是什么?

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也可用

我相信Erlang社区并不羡慕Node.js,因为它以本机方式进行非阻塞I/O,并且可以轻松地将部署扩展到多个处理器(Node.js中甚至没有内置)。更多详情请访问和

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


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

  • 事件:没有线程操作,程序员只提供回调(在Snap框架中)

  • 回调保证在单个线程中运行:不可能存在争用条件
  • 漂亮简单的UNIX友好API。好处:出色的HTTP支持。DNS也可用
  • 默认情况下,每个I/O都是异步的。这样更容易避免锁定。但是,回调中过多的CPU处理将影响其他连接(在这种情况下,任务应拆分为较小的子任务并重新调度)
  • 客户端和服务器端使用相同的语言。(不过,我看不出这一点有多大价值。jQuery和Node.js共享事件编程模型,但其余的则大不相同。我只是看不出在服务器端和客户端之间共享代码在实践中有什么用处。)
  • 所有这些都打包在一个产品中
  • Haskell能否提供Node.js的一些好处,即一个干净的解决方案,避免阻塞I/O,而无需求助于多线程编程

    是的,事实上事件和线程在Haskell中是统一的

    • 您可以在显式轻量级线程中编程(例如,一台笔记本电脑上有数百万个线程)
    • 或;您可以基于可伸缩的事件通知,以异步事件驱动的方式编程
    线程实际上是跨多个核心运行的,具有无缝的线程迁移、记录在案的性能和应用程序

    例如,为了

    • 大量地
    • 并发集合
    • 对分析和调试的工具支持
    • 高性能
    • 有趣的用户:
    32核上的并发集合

    在Haskell中,您既有事件也有线程,因此所有事件都是隐藏的


    描述实现。

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

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

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

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


    首先,我不认为node.js公开所有这些回调是正确的。您最终以CPS(延续传递样式)编写程序,我认为编译器的工作应该是进行转换

    事件:没有线程操作,程序员只提供回调(在Snap框架中)

    因此,考虑到这一点,如果您愿意,可以使用异步样式进行编写,但这样做会错过高效的同步样式的编写,即每个请求一个线程。Haskell在同步代码方面非常高效,特别是与其他语言相比。这是所有的事件背后


    回调保证在单个线程中运行:不可能存在争用条件

    在node.js中仍然可能存在竞争条件,但这更困难

    每个请求都在它自己的线程中。当您编写必须与其他线程通信的代码时,由于haskell的并发原语,使其成为线程安全的代码非常简单

    漂亮简单的UNIX友好API。好处:出色的HTTP支持。DNS也可用

    看看hackage,自己看看

    默认情况下,每个I/O都是异步的(但有时这会让人恼火)。这样更容易避免锁定。但是,回调中过多的CPU处理将影响其他连接(在这种情况下,任务应拆分为较小的子任务并重新调度)

    如果您没有这些问题,ghc将把您的工作分配给真正的OS线程

    cl使用相同的语言