为什么node.js在单线程时速度很快?

时间:2015-06-04 08:19:16

标签: javascript node.js

尽管是单线程的,但node.js如何更快? 我没有运行任何测试来查找统计数据,但在挖掘node.js论坛时,我发现每个人都说它更快,更轻量级。 但无论它的重量如何轻,单线程服务器如何比多线程服务器更快?

3 个答案:

答案 0 :(得分:23)

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

部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是线程正在等待某些IO操作(这种情况经常发生,特别是在一个服务器),其他线程仍然可以进展。

现在,节点呢?

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

More explanation here

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

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的异步功能时,这才有效。任何时候你使用结束于"同步"像writeFileSync一样,你正在打败并发。

答案 1 :(得分:7)

Node.js不是单线程的:请参阅https://nodejs.org/about/

  

任何连接都可以同时处理

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

此外,您可以通过child_process.fork

使用其他子流程

最后,这不会以任何方式调节响应速度或发动机的整体速度。多线程用于可伸缩性

答案 2 :(得分:1)

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