Node.js - 单线程,非阻塞?

Node.js - single thread, non-blocking?

我正在学习 Node.js 并且我读到 Node.js 是单线程和非阻塞的。

我在 JavaScript 方面有很好的背景,我确实理解回调,但我真正不明白的是 Node.js 如何成为单线程和 运行 代码的背景。这不是自相矛盾吗?

因为如果Node.js是单线程的,它仍然只能同时执行一个任务。因此,如果它 运行 在后台执行某些操作,则它必须停止当前任务以在后台处理某些操作,对吗?

实际效果如何?

"in the background" 就 NodeJS 而言,真正的意思是将事情放在待办事项列表中以备后用。每当 Node 完成它正在做的事情时,它会从待办事项列表的顶部选择。这就是为什么做任何实际上是阻塞的事情都会毁了你的一天。正在发生的一切"in the background"(实际上只是在等待待办事项列表)都会停止,直到阻塞任务完成。

Lucas 解释得很好,但我想补充一点,如果您想利用处理器,可以通过一些集群库添加 "nodes"。

集群教程:http://blog.carbonfive.com/2014/02/28/taking-advantage-of-multi-processor-environments-in-node-js/

一些托管商会给你 'scalability' 选项,比如 Heroku

无论如何,当您将 MongoDB 与 NodeJS 一起使用时(例如通过 Mongoose),它会创建多个连接。

注意:单线程的优势是可以处理数百万用户。使用遗留的多线程服务器 (apache),您为每个用户创建一个线程,然后您需要非常大的服务器来处理数千人。

虽然 JavaScript 引擎是单线程的,但有多个线程 "in the background" 处理所有非阻塞 I/O 工作。

具体来说,libuv 有一个等待 OS 事件、I/O 信号、运行ning C++ 代码等的工作线程池。这个池的大小由 UV_THREADPOOL_SIZE环境变量。

没有 JavaScript 代码 运行 "in the background"。 JavaScript 函数(即回调)被安排到 运行 稍后在主事件循环中,由其他 JS 函数或直接由 libuv worker 安排。如果循环被阻塞,那么所有计划都必须等待它。

事实上,Node.js 并不完全是单线程的。 Node.js 使用一个 "main thread",这是执行脚本的线程。这个主线程绝不能被阻塞。所以 long-运行 操作是在单独的线程中执行的。例如,Node.js 使用 libuv 库维护用于执行 I/O.

的线程池