gpt4 book ai didi

javascript - Node Js 内部线程池究竟是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 23:10:55 25 4
gpt4 key购买 nike

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

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

如果我是对的,剩下的请求将在哪里处理?主单线程是非阻塞的,并且不断地向相应的算子发送请求,那么当所有的worker线程都充满了任务时,这些请求会去哪里呢? .

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

enter image description here

最佳答案

libuv 提供的单个、每个进程的线程池默认创建 4 个线程。 UV_THREADPOOL_SIZE 环境变量可用于更改 node 进程启动时创建的线程数,最大值为 1024(截至 libuv 版本 1.30.0) .

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

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

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

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

libuv thread pool如果需要,文档会提供更多技术细节。

关于javascript - Node Js 内部线程池究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com