- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已经阅读了很多关于 NodeJs 如何工作的文章。但是我仍然无法弄清楚Nodejs的内部线程是如何进行IO操作的。
在这个答案中 https://stackoverflow.com/a/20346545/1813428 ,他说NodeJs的线程池中有4个内部线程来处理I/O操作。那么如果我有 1000 个请求同时到来,每个请求都想做 I/O 操作,比如从数据库中检索大量数据。 NodeJs 会将这些请求分别传递给这 4 个工作线程,而不阻塞主线程。所以 NodeJs 可以同时处理的最大 I/O 操作数是 4 个操作。我错了吗?
如果我是对的,剩下的请求将在哪里处理?主单线程是非阻塞的,并且不断地向相应的算子发送请求,那么当所有的worker线程都充满了任务时,这些请求会去哪里呢? .
在下图中,所有的内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主单线程不断驱动新的请求这些 worker ,这些请求会去哪里?它是否有一个内部任务队列来存储这些请求?
最佳答案
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/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!