代码之家  ›  专栏  ›  技术社区  ›  d-_-b

节点。js在一个类方法中生成多个线程

  •  2
  • d-_-b  · 技术社区  · 8 年前

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

    起初我试着使用 cluster 模块,但我意识到它只是重新运行 整体 过程从一开始就应该如此。

    我怎样才能实现下面概述的目标?

    我希望生成类的方法 n 当并行任务完成时,我可以解决方法返回的承诺。

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

    指数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');
    

    人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(); }
                     });
                }
            });
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   kabanus    8 年前

    我认为简短的答案是不可能的。更糟糕的是,这与 js . 对于特定问题中的多线程(进程或线程),您基本上需要每个线程中的对象副本,因为它需要(可能)访问字段-在这种情况下,您需要在每个线程中初始化它或共享内存。最后一个我认为没有提供 cluster

    如果计算独立于人员,我建议您提取它,并使用通常的(在 index.js ):

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

    然后收集结果并根据需要更换人员。您将复制 ,但这是标准的,您只运行您需要的。

    问题是结果是否取决于人。如果这些都是常数 i 不是用于方法,而是用于应用程序本身,这是标准的分叉行为。

    另一种解决方案

    child_process.execFile child_process.exec 在同一个文件中。

    通过这种方式,您可以动态生成一个完全独立的进程。现在不打电话了 cluster.fork 你打电话 execFile . 您可以使用退出代码或stdout作为返回值(stderr等)。Promise现在替换为:

           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 你的代码需要 一、 并在退出代码中或通过stdout返回所需内容,这两个属性都是返回的 child_process . 这有点不合适- node.js -因为您正在等待异步调用,但您的需求是非标准的。因为我不确定如何使用它,所以用数组返回回调可能是一个更好的主意。