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

Why node.js is fast when it's single threaded?

本文关键字:速度 很快 单线程 node js 为什么      更新时间:2023-09-26

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

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

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

那么node呢

Node不是单线程。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一个回调,该回调将在操作完成时被调用。

当然,这只在使用Node的异步函数时才有效。任何时候你使用一个以"Sync"结尾的函数,比如writeFileSync,你就是在破坏并发性。

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

任何连接都可以并发处理

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

也可以通过child_process.fork

使用额外的子进程

最后,这并不以任何方式限制响应速度或发动机的总速度。

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