【发布时间】:2014-11-12 17:46:24
【问题描述】:
NodeJS 批处理多 threading 处理 - 池中的子进程。
我知道子进程是进程,而不是线程。我使用了错误的语义,因为当您谈到“多线程”时,大多数人都知道您的意图。所以我会保留在标题中。
想象一个场景,您使用单个自定义函数或模块不断地有多个相似且复杂的事情要做。使用所有可用的内核/线程(例如 8/16)很有意义,这就是 child_process.fork() 的用途。
理想情况下,您将需要多个同时工作的工作人员并向/从一个控制器发送/回调消息。
node-cpool、fork-pool、child-pool 是一些可以做到这一点的模块,但它们看起来很旧/未维护/不受欢迎。
有很多类似的模块,但这些似乎是最相关的。它们的共同点是几个提交,几乎没有加星标,几乎没有分叉和放弃。
通常情况下,当我无法为一项似乎在各方面都有意义的任务找到一些东西时,我错过了一种更好的方法。因此我的问题。
如何为我的自定义模块创建一个托管的、排队的、多线程并行池fork()s,以完成一些 CPU 密集型工作?
像TAGG 和webworker-threads 这样的多线程模块并不相同,因为它们不支持完整的模块(带有二进制编译的组件)。
附言
我现在正在使用fork-pool,它似乎完全符合我的要求,但有一些怪癖,但我不敢相信这样一个未知且不受欢迎的模块将是这里唯一可行的选择。
【问题讨论】:
-
child_process.fork()创建一个进程而不是一个线程。为每个 CPU 密集型任务分叉一个进程似乎并不正确。 node.js(无需第三方原生模块的帮助)为 IO 密集型应用程序提供单线程环境。您可能可以编写一个多语言应用程序并使用 message-queue 将 CPU 密集型任务卸载到多线程环境。 -
抱歉,我没有正确处理问题中的语义。我知道
fork()创建了一个流程。事实上,进程和线程都在那些“每核线程”硬件通道之一中独立地执行代码。假设我知道我在做什么并且运行 8 个进程就可以了。我从未听过有人抱怨某个软件的运行速度是原来的 2 倍。 Node 以 child_process 的形式为需要它的人提供了一个多线程工具集。
标签: multithreading node.js child-process fork