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操作时,它们被委托给libuv , libuv使用自己的(multithreading,asynchronous)环境来pipe理请求。 libuv宣布I / O操作的完成,允许等待这个事件的任何callback被重新引入主V8线程执行。
V8 – >委托I / O( libuv ) – >线程池 – >multithreadingasynchronous
JavaScript是单线程的,事件模型也是如此。 但是,节点堆栈不是单线程的。
节点利用V8引擎进行并发。