Javascript 为什么node.js在';是单螺纹的吗?

Javascript 为什么node.js在';是单螺纹的吗?,javascript,node.js,Javascript,Node.js,尽管是单线程的,node.js如何更快? 我还没有运行任何测试来查找统计数据,但在node.js论坛中,我发现大家都说它更快、更轻量级。 但是,不管它有多轻,单线程服务器怎么可能比多线程服务器更快呢?首先,为什么程序在多线程时更快? 部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是当一个线程正在等待某个IO操作时(通常情况下,尤其是在服务器中),其他线程仍可以继续运行 现在,节点呢? 节点不是单线程的。JS中的用户脚本在一个线程中执行,但所有IO操作都由libuv和操作系统(多

尽管是单线程的,node.js如何更快? 我还没有运行任何测试来查找统计数据,但在node.js论坛中,我发现大家都说它更快、更轻量级。
但是,不管它有多轻,单线程服务器怎么可能比多线程服务器更快呢?

首先,为什么程序在多线程时更快?

部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是当一个线程正在等待某个IO操作时(通常情况下,尤其是在服务器中),其他线程仍可以继续运行

现在,节点呢?

节点不是单线程的。JS中的用户脚本在一个线程中执行,但所有IO操作都由libuv和操作系统(多线程)本机处理

实际上,这意味着并行处理多个请求。下面是一个非常(非常)简化的动作序列示例:

user script                     | node + OS "threads" (libuv)
-------------------------------------------------------------
receive and analyze request 1   |
ask node for file 1             | fetching file 1
receive and analyze request 2   | fetching file 1
ask node for file 2             | fetching file 1, fetching file 2
prepare response header 1       | fetching file 2
tell node to send file 1        | send file 1, fetching file 2
prepare response header 2       | send file 1
tell node to send file 2        | send file 1, send file 2
node(和io.js)的整个体系结构使得具有高水平的并行性变得简单。用户线程仅由事件循环调用,用于非常短的任务,这些任务在下一个IO操作时停止(实际上,不仅是IO,而且大多数情况下都是这样),此时代码向节点提供回调,该回调将在操作完成时调用


当然,这仅在使用Node的异步函数时有效。任何时候使用以“Sync”结尾的函数(如),都会破坏并发性。

Node.js不是单线程的:请参阅:

任何连接都可以并发处理

事实上,它不使用系统线程,而是通过异步回调将V8引擎与库一起用于多线程

此外,您还可以通过使用其他子进程


最后,这不会以任何方式影响响应速度或发动机的整体速度。多线程是为了可伸缩性而出现的。

因为nodejs不会等待响应,相反,它遵循带有回调的事件驱动编程,即一旦提交请求,它将被推送到事件队列中,每个请求都由单个线程处理,但该线程只提交请求并移动到下一个请求,依此类推,并且从不等待响应。一旦请求被处理,请求的相应回调函数将被执行。

比什么更快???@LaurentB在服务器上肯定比在浏览器上快…我又有一个困惑@DenysSéguret。节点的工作方式类似于,它启动一些IO并分配回调。现在,一旦操作系统完成了这个过程,谁会调用回调?又是事件循环吗?如果是的话,那么事件循环管理数千次回调不是一个错误吗?为什么事件循环不是多线程的?请阅读并感谢u@Denys的解释和链接。这有帮助。