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

尽pipe是单线程,node.js是如何更快? 我还没有运行任何testing来查找统计信息,但在挖掘node.js论坛时,我发现每个人都说它更快,更轻量。 但是不pipe它的重量是多轻,单线程服务器怎么能比multithreading服务器更快呢?

首先,为什么multithreading程序更快?

部分原因是multithreading程序可以在多核上运行,但主要原因是,当一个线程正在等待某个IO操作(通常是特别是在服务器上)时,其他线程仍然可以进步。

那么节点呢?

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

这里更多的解释 。

实际上,这意味着几个请求是并行处理的。 下面是一个可能的一系列操作的非常简单的例子:

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 

节点(和io.js)的整个架构使其具有高水平的并行性变得简单。 用户线程只在事件循环中被调用,用于在下一次IO操作时停止的非常短的任务(当然,并不仅仅是IO,但最经常的情况)是当你的代码给一个节点一个callback函数,这个callback函数将在操作完成时被调用。

当然,这只适用于使用Node的asynchronousfunction。 任何时候你使用一个以“Sync”结尾的函数,比如writeFileSync ,你就是在破坏并行性。

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

任何连接都可以同时处理

实际上,它不使用系统线程,而是使用V8引擎和libuv库通过asynchronouscallback进行multithreading

另外,你可以通过child_process.fork来使用额外的subprocess

最后,这不以任何方式调节响应速度或发动机的整体速度。 multithreading在这里是为了可扩展性