Javascript How Nodejs';s的内部线程池工作正常吗?
我读了很多关于NodeJs如何工作的文章。但我仍然无法准确地理解NodeJ的内部线程是如何进行IO操作的 在这个回答中,他说NodeJ的线程池中有4个内部线程来处理I/O操作。那么,如果同时有1000个请求,每个请求都要执行I/O操作,比如从数据库中检索大量数据,该怎么办呢。NodeJs将分别向这4个工作线程发送这些请求,而不阻塞主线程。因此,NodeJ可以同时处理的I/O操作的最大数量是4个操作。我错了吗 如果我是对的,其余的请求将在哪里处理?。主单线程是非阻塞的,并不断将请求驱动到相应的操作员,因此,当所有工作线程都充满任务时,这些请求将去哪里 在下图中,所有内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主单线程不断向这些工作线程驱动新的请求,这些请求会去哪里?它是否有用于存储这些请求的内部任务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个操作。我错了吗 如果我是对的,其余的请求将在哪里处理?。主单线程是非阻塞的,并不断将请求驱动到相应的操作
不,线程池的主要用例是卸载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++有多舒服?