首页 > 解决方案 > Node.js 如何在资源有限的系统上调度 Workers

问题描述

我想知道如何充分利用 nodejs 的worker_threads中的 Worker 类,特别是在 1 或 2 cpu 系统上,与我刚刚在常规 nodejs 程序中的 for 循环中阻塞相比,任务安排得更好(不使用任何工人API)?他们只是委托给操作系统吗?

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

标签: node.jsworkerworker-thread

解决方案


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

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

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

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

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


推荐阅读