2016-10-04 69 views
0

我遇到了一些child_process分叉的問題,我想這就像stdio。分叉的子進程掛在node.js

當我通過一些js代碼fork之後,子進程請求流數據然後接收數據,只是通過數據到父進程。 當我在日誌「Count [1503]」停止後向兒童添加日誌時。 (我不知道你的情況也1499,但卻完全相同的數據manytimes你試試)

我只是做以下 示例代碼(EXCUTE test.js)

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

// test_child.js

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) 

的原因,我想這是關於標準輸入輸出相關的緩衝區,當我添加一些文本日誌,日誌計數是要做空。

請幫助我,誰知道node.js的

感謝提前。

回答

0

當您通過silent: truechild_process.fork()時,在父母和子女之間使用管道。在你的父母腳本中,你永遠不會讀取孩子的流(尤其是標準輸出),所以在某些時候內部緩衝區已經填滿了,內置的背壓機制導致進程停止接受孩子的輸出。

添加這樣的事情你父腳本,以保持來源的穩定,並預期它應該工作:

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

這特別將簡單地忽略輸出。如果您需要輸出,您應該添加'data'事件處理程序或確保經常在流上調用.read()

+0

非常感謝你!我沒有找到刷新流緩衝區,即使我猜測流緩衝區。 – user1971888