Node.js在类方法中产生多个线程

当作为类的方法调用时,如何多次运行单个方法multithreading?

起初我试图使用cluster模块,但是我意识到它只是从一开始就重新运行整个过程,理所当然地。

我如何实现如下所述的内容?

我想要一个类的方法来产生n个进程,当并行任务完成时,我可以解决方法返回的承诺。

下面的代码的问题是调用cluster.fork()将fork index.js进程。

index.js

 const Person = require('./Person.js'); var Mary = new Person('Mary'); Mary.run(5).then(() => {...}); console.log('I should only run once, but I am called 5 times too many'); 

Person.js

 const cluster = require('cluster'); class Person{ run(distance){ var completed = 0; return new Promise((resolve, reject) => { for(var i = 0; i < distance; i++) { // run a separate process for each cluster.fork().send(i).on('message', message => { if (message === 'completed') { ++completed; } if (completed === distance) { resolve(); } }); } }); } } 

我认为简短的回答是不可能的。 更糟的是,这与js无关。 要在你的特定问题中多进程(线程),你基本上需要在每个线程中有一个对象的副本,因为它需要(也许)访问字段 – 在这种情况下,你需要在每个线程中初始化它或共享内存。 最后一个我不认为是在cluster提供的,在每个用例中都不是其他语言中的小事。

如果计算是独立的人我build议你提取它,并使用通常(在index.js ):

 if(cluster.isWorker) { //Use the i for calculation } else { //Create Person, then fork children in for loop } 

然后收集结果并根据需要更改人员。 你将复制index.js ,但这是标准的,你只运行你所需要的。

问题是结果是否依赖于Person。 如果这些对i都是恒定的,你仍然可以独立地把它们送到你的叉子上。 否则,你有什么是唯一的方式来分叉。 一般来说,在cluster分叉不是为了方法,而是为了标准分叉行为的应用本身。

解决scheme

在你的评论之后,我build议你在同一个文件上签出child_process.execFile或者child_process.exec

这样你就可以在飞行中产生一个完全独立的过程。 现在不用调用cluster.fork而是调用execFile 。 你可以使用退出代码或stdout作为返回值(stderr等)。 诺言现在被replace为:

  var results = [] for(var i = 0; i < distance; i++) { // run a separate process for each results.push(child_process.execFile().child.execFile('node', 'mymethod.js`,i])); } //... catch the exit event from all results or return a callback using results. 

mymethod.js里面你的代码需要i并返回你想要的任何退出代码或通过标准输出,返回的child_process两个属性。 这有点un- node.js -y,因为你在等待asynchronous调用,但是你的需求是不标准的。 由于我不知道你是如何使用这个可能返回数组的callback是一个更好的主意。