NodeJS批处理多处理 – 池中的subprocess(或multithreading)

NodeJS批量多 穿线 处理 – 池中的subprocess。

我知道一个孩子的过程是一个过程,而不是一个线程。 我使用了错误的语义,因为当你提到“multithreading”时,大多数人都知道你的意图是什么。 所以我会把它保留在标题中。


设想一个场景,您不断地使用一个自定义函数或模块来执行多个相似和复杂的事情。 使用所有可用的核心/线程(例如8/16)是child_process.fork() ,这是child_process.fork()的用途。

理想情况下,您将需要一个同步的工作人员和一个控制器发送/callback消息。

node-cpool , fork-pool , child-pool是一些完全可以做到这一点的模块,但是它们似乎是旧的/无法维护的。

有很多类似的模块,但是这些模块似乎是最相关的。 他们都有共同的几个承诺,几乎没有出演,几乎没有分叉,并放弃。

通常情况下,当我找不到任何东西似乎是有意义的任何东西,是有一个更好的方式,我失踪了。 因此我的问题。

我如何有一个pipe理,排队, multithreading 并行fork()的池为我的自定义模块,做一些CPU密集型工作?

像TAGG和webworker-threads这样的multithreading模块是不一样的,因为它们不支持完整的模块(使用二进制编译的组件)。


PS

我现在正在使用fork-pool ,它似乎正是我想要的,有一些怪癖,但是我不能相信这样一个未知的和不受欢迎的模块将是唯一可行的select。

我想提供一个不完全回答您的问题的选项,但在select技术时具有灵活性的情况下,可能会在类似于您的情况下有用。

如果将工作转移到.NET环境(C#,F#,IronPython,PowerShell等)是可以接受的,那么您可能对Edge.js项目感兴趣。

这样,您可以使用节点进行IO密集型工作,并将计算密集型工作委托给在同一进程中托pipe的.NET运行时。 Edge.js提供了与.NET代码的高效互操作性 ,允许利用.NET任务并行库和其他function,而不会产生额外的进程。


每当您制作混合应用程序时,都会涉及维护和技术成本。 仔细评估您所获得的成果,并确保根据您项目的优先级确定其成本

Node.js不适合执行阻塞的CPU绑定工作负载。 node.js的独特devise特点是它的单线程,基于事件循环的架构。

Node.js应用程序通常通过将处理委托给外部进程或服务来处理CPU绑定的工作负载。 这涉及到跨进程边界并引起额外的延迟。 ( 更多 )

没有一个很好的理由来介绍复杂性是很愚蠢的。 如果Node.js本身可以处理这个任务,那么在.NET上增加一个依赖关系可能是矫枉过正的。 但是,有很多任务可能是有价值的 。 做一个好的工程师需要一些思考。

我会build议使用像Redis的东西作为你的队列。 下面是一个在Redis和Kue的Node中创build消息总线的教程 。 这可以很好地扩展,并允许你有多个进程,线程,甚至是产生和消耗队列中的项目的机器。

Web Workers标准为JavaScript定义了使用多个线程的方法,并行工作比单个线程可以pipe理的多得多。

对于包含webworker-threads NPM模块的NodeJS ,有几个这样的实现。

使用fork正在走下一条多进程的path,这通常要难以协调。 NodeJS集群系统试图缓解这里的很多摩擦,但远非理想。

我最近遇到了一个由单个node.js进程创build的fork的问题,并提出了自己的解决scheme来解决这个问题。 我终于成功地将解决scheme导出到自己的npm模块,您可以在这里查看:

https://www.npmjs.com/package/forkpool

您可以创build单个池来pipe理所有分支,也可以创build多个分支来pipe理分离的批次。 例如,我的一个应用程序有两个池 – 一个用于pipe理与image processing相关的分叉,另一个用于video处理。 由于video处理比image processing更为密集,video处理池的大小为2,而在8核机器上,具有image processing的大小为4。

我希望能够随着时间的推移不断地改进这个模块,所以可以随时在Github仓库中提出问题或改进请求:

https://github.com/manthanhd/forkpool