分叉的子进程在node.js中挂起

时间:2016-10-04 06:32:20

标签: node.js fork child-process

我遇到过child_process fork的一些问题,我猜它就像stdio。

在我通过一些js代码分叉后,子工作请求流数据,然后接收数据,只需通过数据到父。 当我将日志添加到子节点后,记录后#34; Count [1503]"停止。 (我不确定你的情况也是1499,但你尝试的次数完全相同)

我只是在下面制作示例代码 (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)

我猜它与stdio相关的缓冲区的原因是当我添加一些文本作为日志时,日志计数将会缩短。

请帮助我了解node.js

的人

提前感谢。

1 个答案:

答案 0 :(得分:0)

当您将silent: true传递给child_process.fork()时,会在父级和子级之间使用管道。在您的父脚本中,您永远不会从子流中读取(尤其是stdout),因此在某些时候内部缓冲区正在填满,内置的反压机制会导致进程停止接受来自子进程的输出。 / p>

将这样的内容添加到父脚本中以保持流的流动并且它应该按预期工作:

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

该特定将忽略输出。如果您需要输出,则应添加'data'事件处理程序,或确保经常在流上调用.read()