首页 > 解决方案 > 我们可以使用带有工作线程的 NodeJs 中的多个 cpu 内核来实现并行处理吗?

问题描述

我知道“cluster”和“child_process”可以使用一个CPU的多个内核,这样我们就可以实现真正的并行处理。

我也知道异步事件循环是单线程的,所以我们只能实现并发。

我的问题是关于worker_threads:

假设我的电脑有 4 个核心 CPU,我正在执行一个 nodejs 脚本。该脚本创建三个工作线程。

三个工作线程会利用 CPU 中剩余的 3 个内核来实现并行性吗?

或者三个工作线程将只使用主核心,其余的 3 个核心不使用,就像事件循环一样?

标签: node.jsmultithreadingconcurrencyparallel-processing

解决方案


三个工作线程会利用 CPU 中剩余的 3 个内核来实现并行性吗?

是的,您可以实现并行性。当然,实际的 CPU 分配取决于操作系统,但这些将是真正的操作系统线程,并且能够利用多个 CPU。

或者三个工作线程将只使用主核心,其余的 3 个核心不使用,就像事件循环一样?

不可以。每个工作线程都可以使用单独的 CPU。每个线程都有自己独立的事件循环。

四个线程不独立的主要时间是当它们希望通过消息相互通信时,因为这些消息将通过接收者的事件循环。因此,如果线程 A 向主线程发送消息,则该消息将进入主线程的事件队列,并且不会被主循环接收,直到主循环返回事件循环从事件队列。反过来也是如此。如果您从主线程向线程 A 发送消息,但线程 A 正忙于执行 CPU 密集型任务,则在线程 A 回到事件循环之前不会收到该消息(例如,完成其 CPU 密集型任务)。

此外,如果您的线程正在执行 I/O(尤其是磁盘 I/O),请小心,因为它们可能会竞争对这些资源的访问,并且可能会在等待其他线程完成使用资源之前卡住,然后才能继续。


推荐阅读