2016-10-04 10 views
0

私はchild_process forkに関するいくつかの問題に直面しました。それはstdioのようなものです。forkedの子プロセスがnode.jsでハングする

私はいくつかのjsコードでフォークした後、子供はストリーミングデータを要求し、データを受け取った後、ただデータを親に送ります。 ログに「Count [1503]」というログが記録された後、子ログにログを追加したとき。 (私はあなたが試すしかしmanytimesあなたの場合も、1499年にはわからないけど、まったく同じデータ)

私はちょうど 以下のサンプルコードを作る(test.jsをexcute)

//

をtest.js
var express = require('express'), 
    app = express(), 
    child_process = require('child_process'); 

app.listen(3030, function() { 
    console.log('service started'); 
}); 

var child = child_process.fork(__dirname + '/test_child.js', [], { silent: true }); 

child.on('exit', function(code, signal) { 
    console.log('exit\n', code, signal); 
}) 

//は、私はそれがおよそstdioの関連バッファだと思う理由は、私がログとしていくつかのテキストを追加する場合、カウントはログインしている

var winston = require('winston'), 
    logger = new winston.Logger({ 
     level: 'silly', 
     transports: [ 
      new (winston.transports.File)({ 
       name: 'mainLog', 
       filename: 'child_test.log', 
       level: 'silly' 
      }), 
      new (winston.transports.Console)({ 
       colorize: true, 
      }) 
     ] 
    }); 


var interval = 2, 
    cnt = 1, 
    count = 1; 

setInterval(function() { 
    logger.info('Count[%d]', count++); 
}, interval) 
setInterval(function() { 
    logger.info('CNT[%d]', cnt++); 
}, interval) 

をtest_child.js短くなる。

Node.jsの事前の

感謝を認識している人、私を助けてください。

答えて

0

あなたはchild_process.fork()silent: trueを渡す場合、パイプは、親と子の間で使用されています。あなたの親スクリプトでは、いくつかの点で内部バッファがいっぱいにされており、内蔵のバックプレッシャメカニズムが子供からの出力の受け入れを停止するためのプロセスが発生して、子供のストリーム(特に標準出力)からの読み取りされることはありません。

は流れ流れを維持するために、あなたの親スクリプトに次のようなものを追加して、期待どおりに動作するはずです:

child.stdout.resume(); 
child.stderr.resume(); 

特定単に出力を無視すること。出力が必要な場合は、'data'イベントハンドラを追加するか、ストリーム上で.read()を頻繁に呼び出してください。

+0

ありがとうございました!私はストリームバッファをフラッシュしていないと思っていました。 – user1971888

関連する問題