【问题标题】:Is NodeJS really Single-Threaded?NodeJS 真的是单线程的吗?
【发布时间】:2011-10-24 11:44:42
【问题描述】:

Node.js 通过将基于事件的模型置于其核心,使用事件循环而不是线程来解决“每个连接一个线程问题”。 所有昂贵的 I/O 操作总是异步执行,并在启动的操作完成时执行回调。

如果发生任何操作,则观察由epoll() 等多路复用机制处理。

我现在的问题是:

  • 为什么 NodeJS 在使用阻塞系统调用时不阻塞 选择/epoll/kqueue?

  • 或者 NodeJS 根本不是单线程的,所以第二个线程是
    有必要用 select/epoll/kqueue 观察所有的 I/O 操作吗?

【问题讨论】:

  • 我建议阅读这篇题为“节点不是单线程”的精彩文章:rickgaribay.net/archive/2012/01/28/…
  • 你不能在 NodeJS 中进行并行任务/处理。
  • 您很少在部署中只运行一个 Node 实例,因此您将拥有多个线程。如果你使用的是 Sails.js(Node 的 MVC 框架)之类的东西,你需要确保你的控制器动作是原子的,否则操作会混合起来,结果会出乎意料。

标签: multithreading architecture node.js


【解决方案1】:

NodeJS 是 eventedwebsite 的第二行),不是单线程的。它在内部处理执行 select/epoll/kqueue 处理所需的线程,而无需用户显式管理,但这并不意味着其中没有线程使用。

【讨论】:

  • 并且 JavaScript 环境在单线程中运行。所有其他线程都由 C 级线程池处理。
  • 我希望我也能支持你,Raynos。 (编辑:我可以,有点)
  • 那么是不是说一旦内部线程池中的线程用完(也就是都忙)后,对node js的请求也要等待。
  • @ren 多线程和并行处理是两个完全不同的概念。
  • @AntP 嗯,对我来说,它们并不完全不同,在一台机器上,您可以通过使用多个线程来实现并行性。不?无论如何,这并不能解释为什么 nodejs 使用多个线程时只使用一个内核。
【解决方案2】:

没有。

当 I/O 操作启动时,它们被委托给 libuv,后者使用自己的(多线程、异步)环境管理请求。 libuv 宣布 I/O 操作完成,允许任何等待此事件的回调重新引入 V8 主线程执行。

V8 -> 委托 I/O (libuv) -> 线程池 -> 多线程异步

【讨论】:

    【解决方案3】:

    JavaScript 是单线程的,事件模型也是。但是 Node 栈不是单线程的。

    Node 使用 V8 引擎进行并发。

    【讨论】:

      【解决方案4】:

      整体上没有Nodejs不是单线程的,但是Node-Event循环(nodeJS大量使用)是单线程的

      一些node framework/Std Lib不是单线程的

      【讨论】:

        猜你喜欢
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        相关资源
        最近更新 更多