javascript - 清晰地与使用 Node 的 child_process.fork() 创建的工作进程进行对话

标签 javascript node.js parallel-processing

我正在 fork 许多相同的工作进程,这些进程将被告知要处理的文件名。

我能找到的所有worker_process示例都显示父级仅监听一个worker。像这样的东西:

var cp = require('child_process');

worker = cp.fork('my_worker.js');

worker.on( 'message', function(msg) {
    console.log( 'Parent got message: ' + msg.text );
});

我的问题:如果我想生成 8 个工作线程,是否需要 8 次“worker.on”调用来设置 8 个不同的监听器?监听器位于调用 fork 返回的 childProcess 对象上,这似乎很奇怪。有一个父级,因此您可能认为它将接收来自工作人员的所有消息,并且使用 process.on 设置的监听器可以工作,但事实并非如此。

process.on( 'message', function(msg) {
        console.log( 'I never get called' );
});

最佳答案

我没有找到一种方法来全局收听所有 child 的所有消息。因此,我为每个子进程绑定(bind)了一个监听器,正如我最初怀疑的那样。

但是,它最终并没有那么困惑,因为我使用了闭包。

因此,我生成所有子项的循环如下所示:

// Fork all workers
var workers = []

for ( i = 0; i < numCPUs; i++ ) {

    worker = cp.fork( __dirname + '/../worker.js', [i] );

    worker.on( 'message', make_message_processor(i) );

    worker.on('error', function( err ) {
        console.error( 'Worker: Something bad happened: ' + err );
    });

    workers.push( worker );

}

这将 make_message_process 函数的唯一封闭实例与每个工作人员的消息联系起来。

该函数如下所示:

// Create message processing function for each worker
function make_message_processor( id ) {

    var local_id = id;  // this gets enclosed

    return function ( msg ) {
        //console.log('master: got message:', msg.message);
        switch ( msg.message ) {
            case 'give_me_another':
                console.log( 'master: ' + local_id + ' has asked for a job.' );
                next( local_id );
                break;
            case 'error':
                console.log( 'master: got error from worker process' );
                break;
            case 'default':
                console.log( 'master: got unknown message' );
                break;
        }
    }
}

完整代码位于https://github.com/bitwombat/parallel-uglifyjs

关于javascript - 清晰地与使用 Node 的 child_process.fork() 创建的工作进程进行对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33293194/

相关文章:

javascript - html 到 pdf 转换客户端 javascript 与 CSS 支持

javascript - 下载 JPG、PNG 格式时,签名板上的 Canvas 签名变成全黑

javascript - node.js 无法解析 ISOString 日期?

javascript - 脚本。 JADE 标签未在 Express 中呈现

c++ - 通常减少 cv::Mat 或 cv::Mat 的 vector

javascript - AngularJS 的基本可拖动功能?

javascript - Flexbox 隐藏或显示不流畅

javascript - 如何计算在 Node Js 中有多少唯一的未授权用户打开了特定的 url?

node.js - 使用 node.js 运行许多并行的 http 请求

c++ - 编译 Cilk Plus 程序时遇到问题