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

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

他在回答https://stackoverflow.com/a/20346545/1813428时说,NodeJ的线程池中有4个内部线程来处理I / O操作。 那么如果我有1000个请求同时发生,每个请求都要做I / O操作,比如从数据库中检索一个巨大的数据。 NodeJs将这些请求分别传递给这4个工作线程而不阻塞主线程。 所以NodeJs可以同时处理的最大I / O操作数是4次操作。 我错了吗?。

如果我是对的,剩余的请求将在何处处理? 主要的单线程是非阻塞的,不断驱动对相应的运算符的请求,那么这些请求将在哪里去,而所有的工作线程是充满任务? 。

在下面的图片中,所有的内部工作者线程都充满了任务,假设他们都需要从数据库中检索大量的数据,主要的单线程继续向这些工作人员提出新的请求,这些请求将在哪里去? 它有一个内部任务quese来存储这些请求?

在这里输入图像描述

libuv提供的单进程线程池默认创build4个线程。 可以使用UV_THREADPOOL_SIZE环境variables来更改node进程启动时创build的线程数,最大值为128。

当所有这些线程被阻塞时,使用它们的进一步请求将被排队。 请求线程的API方法称为uv_queue_work

此线程池用于任何系统调用,将导致阻止 IO,其中包括本地文件系统操作。 @Andrey提到,它也可以用来减lessCPU密集型操作的影响。

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

如果您正在使用的数据库驱动程序的源代码可用,并且您能够find对uv_queue_work引用,那么它可能使用了线程池。

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

否,线程池的主要用例是卸载CPU密集型操作。 IO在一个线程中执行 – 如果您并行地等待外部数据,则不需要多个线程,事件循环恰好是组织执行stream程的一种技术,以便尽可能多地并行

例如:您需要发送100封带有问题(y / n)的电子邮件,另外一封带有回答“y”的电子邮件。 写电子邮件需要30秒左右,平均回复时间为2小时+ 10秒才能回复。 你开始写100封电子邮件(50分钟的时间),然后等待警报声,每次回复到达时都会唤醒你,当你收到答案时,你会增加“y”的数量。 在大约2小时50分钟内完成。 这是asynchronousIO和事件循环的例子(没有线程池)

拦截示例:发送电子邮件,等待回答,重复。 需要4天(如果你可以克隆你另外两个)

asynchronous线程池示例:每个响应都使用您不知道的语言。 你有4个翻译朋友。 您可以通过电子邮件发送文本给他们,他们会将翻译后的文本发回给您(或者,更准确的说:您打印文本并将其放入“需要翻译”文件夹中。