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

Pau*_*han 12 javascript node.js

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

Den*_*ret 24

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

部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是当一个线程正在等待某些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
Run Code Online (Sandbox Code Playgroud)

node(和io.js)的整个架构使得具有高水平的并行性变得简单.用户线程仅由事件循环调用,用于非常短的任务,当您的代码向节点提供将在操作完成时调用的回调时,该任务在下一个IO操作(嗯,实际上不是IO,但最常见)停止.

当然,这仅在您使用Node的异步功能时才有效.每当你使用像" writeFileSync "这样的"Sync"结尾的函数时,你就会破坏并发性.


Lau*_*t B 8

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

任何连接都可以同时处理

实际上,它不使用系统线程,而是使用V8引擎和libuv库通过异步回调进行多线程处理.

此外,您可以通过child_process.fork使用其他子进程

最后,这不会以任何方式调节响应速度或发动机的整体速度.多线程就是可扩展性.