簡體   English   中英

與Node的child_process.fork()進行的工作進程進行干凈的交談

[英]Cleanly talking to worker processes made with Node's child_process.fork()

我正在分叉許多相同的工作進程,這些工作進程將被告知要處理的文件名。

我可以找到的所有worker_process示例都顯示了父級僅監聽一個工人。 就像是:

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' );
});

我沒有找到一種方法來全局收聽所有孩子的所有消息。 因此,我將偵聽器綁定到每個子進程,就像我最初懷疑的那樣。

但是,它並不會因為我使用閉包而變得那么混亂。

因此,我產生所有孩子的循環看起來像:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM