尽管是单线程的,但node.js如何更快? 我没有运行任何测试来查找统计数据,但在挖掘node.js论坛时,我发现每个人都说它更快,更轻量级。 但无论它的重量如何轻,单线程服务器如何比多线程服务器更快?
答案 0 :(得分:23)
首先,为什么多线程时程序会更快?
部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是线程正在等待某些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的异步功能时,这才有效。任何时候你使用结束于"同步"像writeFileSync一样,你正在打败并发。
答案 1 :(得分:7)
Node.js不是单线程的:请参阅https://nodejs.org/about/:
任何连接都可以同时处理
实际上,它不使用系统线程,而是通过异步回调将V8引擎与libuv库一起用于多线程。
此外,您可以通过child_process.fork
使用其他子流程最后,这不会以任何方式调节响应速度或发动机的整体速度。多线程用于可伸缩性。
答案 2 :(得分:1)
因为nodejs不会等待响应,而是遵循事件驱动的回调编程,即,一旦提交请求,它将被推送到事件队列中,并且每个请求都由单个线程处理,但是该线程只会提交请求并移至下一个请求,依此类推,从不等待响应。处理请求后,将执行请求的相应回调函数。