2016-10-04 39 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