node.js - 我们可以使用带有工作线程的 NodeJs 中的多个 cpu 内核来实现并行处理吗?
问题描述
我知道“cluster”和“child_process”可以使用一个CPU的多个内核,这样我们就可以实现真正的并行处理。
我也知道异步事件循环是单线程的,所以我们只能实现并发。
我的问题是关于worker_threads:
假设我的电脑有 4 个核心 CPU,我正在执行一个 nodejs 脚本。该脚本创建三个工作线程。
三个工作线程会利用 CPU 中剩余的 3 个内核来实现并行性吗?
或者三个工作线程将只使用主核心,其余的 3 个核心不使用,就像事件循环一样?
解决方案
三个工作线程会利用 CPU 中剩余的 3 个内核来实现并行性吗?
是的,您可以实现并行性。当然,实际的 CPU 分配取决于操作系统,但这些将是真正的操作系统线程,并且能够利用多个 CPU。
或者三个工作线程将只使用主核心,其余的 3 个核心不使用,就像事件循环一样?
不可以。每个工作线程都可以使用单独的 CPU。每个线程都有自己独立的事件循环。
四个线程不独立的主要时间是当它们希望通过消息相互通信时,因为这些消息将通过接收者的事件循环。因此,如果线程 A 向主线程发送消息,则该消息将进入主线程的事件队列,并且不会被主循环接收,直到主循环返回事件循环从事件队列。反过来也是如此。如果您从主线程向线程 A 发送消息,但线程 A 正忙于执行 CPU 密集型任务,则在线程 A 回到事件循环之前不会收到该消息(例如,完成其 CPU 密集型任务)。
此外,如果您的线程正在执行 I/O(尤其是磁盘 I/O),请小心,因为它们可能会竞争对这些资源的访问,并且可能会在等待其他线程完成使用资源之前卡住,然后才能继续。
推荐阅读
- javascript - 更改 JSON 格式以具有适当的隐藏/显示键
- ios - 在标签上打印 instgram 回复时出现问题
- android - 使用 mqtt 发送推送通知,从最近的应用程序中滑动时不起作用
- stripe-payments - 用条纹测试谷歌支付
- ios - 在 iOS 10 上从自定义键盘打开设置应用程序时崩溃
- c# - 如何为另一个类的测试参数设置 IEqualityComparer?
- html - overscroll-behavior 属性不适用于 webview
- docker - 节点 API 失败并出现错误:EHOSTUNREACH
- assembly - S1.geti、S2.geti 都调用同一个过程(称为 Sc_geti)。S1.i 不可用。奇怪的字符
- javascript - 在 parseFloat() 之后将对象键数组中的所有值相加