NodeJS 真的是单线程的吗?

Posted

技术标签:

【中文标题】NodeJS 真的是单线程的吗?【英文标题】:Is NodeJS really Single-Threaded? 【发布时间】: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 框架)之类的东西,你需要确保你的控制器动作是原子的,否则操作会混合起来,结果会出乎意料。 【参考方案1】:

NodeJS 是 evented(website 的第二行),不是单线程的。它在内部处理执行 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不是单线程的

【讨论】:

以上是关于NodeJS 真的是单线程的吗?的主要内容,如果未能解决你的问题,请参考以下文章

node真的是单线程模式吗

服务结构服务完全是单线程的吗?

[UE4]UE4是单线程的吗?

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

nodejs是单线程还是多线程

Async.js - 并行真的是并行的吗?