Javascript 与使用Node';s child_process.fork()

Javascript 与使用Node';s child_process.fork(),javascript,node.js,parallel-processing,Javascript,Node.js,Parallel Processing,我正在分叉许多相同的工作进程,它们将被告知要处理的文件名 我能找到的所有worker_流程示例都显示家长只听一个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个wo

我正在分叉许多相同的工作进程,它们将被告知要处理的文件名

我能找到的所有worker_流程示例都显示家长只听一个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个worker,我是否需要8个worker.on调用来设置8个不同的侦听器?侦听器位于调用
fork
返回的childProcess对象上,这似乎很奇怪。有一个父级,所以您可能认为它将接收来自工作者的所有消息,而设置了process.on的侦听器将起作用,但它不起作用

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

我没有找到一种方法,可以在全球范围内收听来自所有儿童的所有信息。因此,我将侦听器绑定到每个子进程,正如我最初怀疑的那样

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

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

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

}
// 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;
        }
    }
}
完整代码在