NodeJS真的是单线程吗?

Fil*_*tos 59 architecture multithreading node.js

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

如果任何操作发生的观察由epoll()等多路复用机制处理.

我的问题现在是:

  • 为什么在使用阻塞Systemcalls select/epoll/kqueue时NodeJS阻塞?

  • 或者根本不是NodeJS Single Threaded,所以需要第二个Thread
    来观察select/epoll/kqueue的所有I/O操作?

Fem*_*emi 108

NodeJS公平的(网站的第二行),而不是单线程.它在内部处理执行select/epoll/kqueue处理所需的线程,而无需用户明确地管理它,但这并不意味着它内部没有线程使用.

  • JavaScript环境在单个线程中运行.所有其他线程都由C级线程池处理. (136认同)
  • @AntP嗯,对我来说,他们并不完全不同,在一台机器上你通过使用多线程实现并行性.没有?无论如何,这并不能解释为什么nodejs只使用一个核心,如果它使用多个线程. (2认同)

ser*_*kan 8

没有.

启动I/O操作时,它们被委托给libuv,libuv使用自己的(多线程,异步)环境管理请求.libuv宣布完成I/O操作,允许等待此事件的任何回调重新引入主V8线程以供执行.

V8 - >委托I/O(libuv) - >线程池 - >多线程异步