node.js - Node.js 如何在资源有限的系统上调度 Workers
问题描述
我想知道如何充分利用 nodejs 的worker_threads中的 Worker 类,特别是在 1 或 2 cpu 系统上,与我刚刚在常规 nodejs 程序中的 for 循环中阻塞相比,任务安排得更好(不使用任何工人API)?他们只是委托给操作系统吗?
另外,我可以在 Worker 内部阻塞吗?我认为这就是他们的目的。
解决方案
Node.js 如何在资源有限的系统上调度 Workers
Nodejs 工作线程使用底层操作系统线程,因此工作线程由操作系统而不是由 nodejs 调度。如果您的活动线程多于 CPU 内核,那么底层操作系统将在活动线程之间对内核进行时间切片(例如共享)。一般来说,您不应该在主 nodejs 事件循环线程中编写阻塞的 for 循环,但是对于该部分问题的更多细节,我们需要查看您正在谈论的实际代码,确切的上下文是什么以及替代方案是什么。
另外,我可以在 Worker 内部阻塞吗?我认为这就是他们的目的。
是的你可以。它不会对主事件循环线程产生任何不利影响。当然,当工作线程被阻塞时,您将无法在工作线程中执行任何其他操作。此外,您可能想知道 nodejs 中的工作线程不是轻量级的东西(就内存使用而言)。每个都带有一个单独的 V8 解释器环境。因此,在资源不足的系统中,您必须非常仔细地计划内存使用,因为 nodejs + 多个工作线程不会导致内存使用低。
请记住,每个 V8 解释器实例还为 libuv 引擎创建自己的线程池,用于加密操作和文件操作等操作,以允许阻塞 OS 系统调用向 JS 引擎提供异步接口。所以,除了你的 Javascript 线程之外,还有一些 nodejs API 中涉及到这些 libuv 线程。
推荐阅读
- spatstat - pp3 是否有等同于 ppp 的标记?
- javascript - Python / Django 无法解码由 javascript 编码为 base64 的文件
- angular - 为 Windows 平台运行 Ionic cordova 应用程序时出错
- ios - 在 iOS 上使用 Flutter 授予位置权限
- pandas - 使用多级索引转换 pandas 数据透视表
- python - 通过 /static/js/ 访问 Django 的模板文件夹
- python - 在 sklearn 管道中使用 spacy 作为分词器
- python-2.7 - 如何使用 python 从 REST API 请求 AWS 现货实例定价
- python - python- sys.argv CLI 参数的帮助程序列表
- filenotfoundexception - 自己导入 spring-boot-starter,开始打印错误日志 'Unable to read meta-data for class'