用Node的child_process.fork()干净地与工作进程交谈

时间:2015-10-23 00:54:08

标签: javascript node.js parallel-processing

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

我能找到的所有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' );
});

1 个答案:

答案 0 :(得分:0)

我没有找到全局收听来自所有孩子的所有邮件的方法。所以,我把听众绑在每个子进程上,正如我原先怀疑的那样。

但是,它并没有因为我使用闭包而变得那么混乱。

所以,我产生所有孩子的循环看起来像是:

// 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

的完整代码