Nodejs的内部线程池如何工作?

Nic*_*ick 11 javascript multithreading event-loop node.js

我已经阅读了很多关于NodeJ如何工作的文章.但我仍然无法弄清楚Nodej的内部线程是如何进行IO操作的.

在这个答案/sf/answers/1424258181/中,他说NodeJ的线程池中有4个内部线程来处理I/O操作.那么,如果我同时有1000个请求,每个请求都想进行I/O操作,例如从数据库中检索大量数据.NodeJs将分别​​将这些请求传递给这4个工作线程,而不会阻塞主线程.因此,NodeJ可以同时处理的最大I/O操作数是4个操作.我错了吗?.

如果我是对的,剩下的请求将在哪里处理?主要的单线程是非阻塞的并且继续将请求驱动到相应的操作员,那么这些请求在所有工作线程充满任务的情况下会在哪里进行?.

在下图中,所有内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主要单线程继续向这些工作者发送新请求,这些请求将在何处进行?是否有内部任务queuse来存储这些请求?

在此输入图像描述

Lov*_*ler 11

libuv提供的单个每进程线程池默认创建4个线程.的UV_THREADPOOL_SIZE环境变量可被用于改变创建的线程的数目,当node处理开始时,多达128个最大值.

当所有这些线程都被阻止时,进一步使用它们的请求就会排队.调用请求线程的API方法uv_queue_work.

此线程池用于将导致阻塞 IO的任何系统调用,其中包括本地文件系统操作.正如@Andrey所提到的,它还可以用来减少CPU密集型操作的影响.

大多数网络操作支持的非阻塞 IO不需要使用线程池.

如果您正在使用的数据库驱动程序的源代码可用,并且您能够找到uv_queue_work对它的引用,则可能正在使用该线程池.

如果需要,libuv 线程池文档提供了更多技术细节.