Node.js 如何在有限资源系统上调度 Worker

How does Node.js schedule Workers on a limited resource system

我想知道如何在 nodejs 的 worker_threads 中充分利用 Worker class,特别是在 1 或 2 cpu 系统上,任务是否得到调度比我刚刚阻塞在常规 nodejs 程序的 for 循环中更好(不使用任何工作人员 api)?他们只是委托给 OS 吗?

另外,我可以在 Worker 中阻塞吗?我以为这就是他们的目的。

How does Node.js schedule Workers on a limited resource system

Nodejs 工作线程使用底层 OS 线程,因此工作线程由 OS 而不是 nodejs 调度。如果您的活动线程多于 CPU 个内核,则底层 OS 将对活动线程之间的内核进行时间切片(例如共享)。一般来说,你不应该在主 nodejs 事件循环线程中编写一个阻塞的 for 循环,但是对于问题的那部分的更多细节,我们需要查看你正在谈论的实际代码,精确的上下文是什么以及替代方案是什么。

Also, can I block inside a Worker? I assumed that's what they are for.

是的,你可以。它不会对主事件循环线程产生任何不利影响。当然,当工作线程被阻塞时,您将无法在工作线程中执行任何其他操作。此外,您可能想知道 nodejs 中的工作线程不是轻量级的东西(就内存使用而言)。每个都带有一个单独的 V8 解释器环境。因此,在低资源系统中,您必须非常仔细地计划内存使用,因为 nodejs + 多个工作线程不会降低内存使用量。

请记住,每个 V8 解释器实例还会为 libuv 引擎创建自己的线程池,以用于加密操作和文件操作等操作,以允许阻塞 OS 系统调用以向JS 引擎。所以,除了你的 Javascript 线程之外,还有一些 libuv 线程涉及一些 nodejs API。