NodeJS真的是单线程吗?

Node.js通过使用事件循环而不是线程来将基于事件的模型放在其核心上,从而解决了“每个连接问题一个线程”的问题。 所有昂贵的I / O操作总是与启动操作完成时执行的callbackasynchronous执行。

如果任何操作发生,观察是由像epoll()这样的复用机制来处理的。

我现在的问题是:

  • 为什么不使用阻塞SystemJall阻止NodeJS阻塞select / epoll / kqueue?

  • 或者根本不是NodeJS单线程,所以第二个线程是
    必须用select / epoll / kqueue观察所有的I / O操作?

NodeJS平坦的 (从网站的第二行),而不是单线程。 它在内部处理需要做select / epoll / kqueue处理的线程,而不需要用户明确地pipe理它,但是这并不意味着它内部没有线程的使用。

没有。

当启动I / O操作时,它们被委托给libuvlibuv使用自己的(multithreading,asynchronous)环境来pipe理请求。 libuv宣布I / O操作的完成,允许等待这个事件的任何callback被重新引入主V8线程执行。

V8 – >委托I / O( libuv ) – >线程池 – >multithreadingasynchronous

JavaScript是单线程的,事件模型也是如此。 但是,节点堆栈不是单线程的。

节点利用V8引擎进行并发。