【发布时间】:2015-06-06 22:13:26
【问题描述】:
我已经阅读了很多关于 NodeJs 如何工作的文章。但是我仍然无法弄清楚Nodejs的内部线程是如何进行IO操作的。
在这个答案https://stackoverflow.com/a/20346545/1813428 中,他说NodeJs的线程池中有4个内部线程来处理I/O操作。那么如果我有 1000 个请求同时到来,每个请求都想做 I/O 操作,比如从数据库中检索大量数据。 NodeJs 会将这些请求分别传递给这 4 个工作线程,而不会阻塞主线程。所以 NodeJs 可以同时处理的最大 I/O 操作数是 4 个操作。我错了吗?
如果我是对的,剩下的请求将在哪里处理?主单线程是非阻塞的,不断地向对应的算子发起请求,那么在所有的worker线程都满载任务的情况下,这些请求会去哪里呢? .
在下图中,所有的内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主单线程不断驱动新的请求这些工人,这些请求会去哪里?它是否有一个内部任务队列来存储这些请求?
【问题讨论】:
-
您对 C 或 C++ 的熟悉程度如何?
-
这 1000 个请求来自单个以太网/wifi 卡。硬件本身只能处理字节流。没有 1000 个并行网络请求之类的东西,除非您的机器上有多个连接到多个调制解调器的以太网卡连接到您的 ISP(通常这意味着多个 Internet 帐户)。现实世界中实际存在的是 1000 个网络请求轮流在单个连接上发送位 - 这样做速度足够快,您会产生 1000 个并行请求的错觉..
-
... 因为是这种情况(在现实世界中通常没有并行请求之类的东西)node.js 避免了大多数人使用的多线程的内存和上下文切换开销(大多数人,不是所有人 - 其他语言也开始变得聪明,例如 Java 的 Netty 在单个线程上完成所有网络处理)。 Node.js 并行等待,而不是尝试并行执行代码。等待恰好需要 0% 的 CPU 时间。
标签: javascript node.js multithreading event-loop