Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript How Nodejs';s的内部线程池工作正常吗?_Javascript_Node.js_Multithreading_Event Loop - Fatal编程技术网

Javascript How Nodejs';s的内部线程池工作正常吗?

Javascript How Nodejs';s的内部线程池工作正常吗?,javascript,node.js,multithreading,event-loop,Javascript,Node.js,Multithreading,Event Loop,我读了很多关于NodeJs如何工作的文章。但我仍然无法准确地理解NodeJ的内部线程是如何进行IO操作的 在这个回答中,他说NodeJ的线程池中有4个内部线程来处理I/O操作。那么,如果同时有1000个请求,每个请求都要执行I/O操作,比如从数据库中检索大量数据,该怎么办呢。NodeJs将分别向这4个工作线程发送这些请求,而不阻塞主线程。因此,NodeJ可以同时处理的I/O操作的最大数量是4个操作。我错了吗 如果我是对的,其余的请求将在哪里处理?。主单线程是非阻塞的,并不断将请求驱动到相应的操作

我读了很多关于NodeJs如何工作的文章。但我仍然无法准确地理解NodeJ的内部线程是如何进行IO操作的

在这个回答中,他说NodeJ的线程池中有4个内部线程来处理I/O操作。那么,如果同时有1000个请求,每个请求都要执行I/O操作,比如从数据库中检索大量数据,该怎么办呢。NodeJs将分别向这4个工作线程发送这些请求,而不阻塞主线程。因此,NodeJ可以同时处理的I/O操作的最大数量是4个操作。我错了吗

如果我是对的,其余的请求将在哪里处理?。主单线程是非阻塞的,并不断将请求驱动到相应的操作员,因此,当所有工作线程都充满任务时,这些请求将去哪里

在下图中,所有内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主单线程不断向这些工作线程驱动新的请求,这些请求会去哪里?它是否有用于存储这些请求的内部任务


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

例如: 您需要发送100封电子邮件,其中包含一个问题(y/n),另一封电子邮件的回答数为“y”。写电子邮件大约需要30秒,回复平均需要2小时,阅读回复平均需要10秒。你开始写100封电子邮件(50分钟),然后等待警报声,每次收到回复时都会唤醒你,当你收到回复时,你会增加“y”的数量。再过2小时50分钟,你就完成了。这是异步IO和事件循环的示例(无线程池)

阻止示例:发送电子邮件,等待答复,重复。需要4天(如果您可以克隆另一个,则需要两天)


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

默认情况下,libuv提供的单进程线程池会创建4个线程。
UV\u THREADPOOL\u SIZE
环境变量可用于更改
节点
进程启动时创建的线程数,最大值为128

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

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

大多数网络操作都支持非阻塞IO,无需使用线程池

如果您正在使用的数据库驱动程序的源代码可用,并且您能够找到对
uv\u queue\u work
的引用,那么它可能正在使用线程池


LIHBV文档提供了更多的技术细节,如果需要的话。

你对C或C++有多舒服?