Node.js通过将基于事件的模型置于其核心,使用事件循环而不是线程来解决“每个连接一个线程问题”。 所有昂贵的I / O操作总是与启动操作完成时执行的回调异步执行。
观察如果发生任何操作,则由epoll()等多路复用机制处理。
我的问题现在是:
为什么NodeJS在使用阻塞系统调用时不会阻塞 选择/ epoll的/ kqueue的?
或者根本不是NodeJS Single Threaded,所以第二个Thread是
使用select / epoll / kqueue观察所有I / O操作是否必要?
答案 0 :(得分:108)
NodeJS 已经(来自website的第二行),而不是单线程。它在内部处理执行select / epoll / kqueue处理所需的线程,而无需用户明确地管理它,但这并不意味着它内部没有线程使用。
答案 1 :(得分:8)
没有
当启动I / O操作时,它们被委派给 libuv ,后者使用自己的(多线程,异步)环境管理请求。 libuv宣布完成I / O操作,允许等待此事件的任何回调重新引入主V8线程以供执行。
V8 - >委托I / O( libuv ) - >线程池 - >多线程异步
答案 2 :(得分:0)
JavaScript是单线程的,事件模型也是如此。但是Node堆栈不是单线程的。
Node利用V8引擎实现并发。
答案 3 :(得分:0)
总体上没有Nodejs不是单线程的,但是Node-Event循环(nodeJS大量使用的)是单线程的
某些节点框架/ Std Lib不是单线程的