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

forked child process hangs in node.js

我在使用 child_process fork 时遇到了一些问题,我想这就像 stdio。

在我通过一些 js 代码 fork 之后,child 请求流数据然后接收数据,只是通过数据到 parent。 当我将日志添加到 child 时,日志 "Count[1503]" 停止后。 (我不确定你的情况是否也是 1499,但无论你尝试多少次,数据都完全相同)

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

提前致谢。

当您将 silent: true 传递给 child_process.fork() 时,在 parent 和 child 之间使用管道。在你的 parent 脚本中,你永远不会从 child 的流(尤其是 stdout)中读取,所以在某些时候内部缓冲区正在填满并且 built-in 背压机制导致进程停止接受来自 child.

的输出

在您的 parent 脚本中添加类似这样的内容以保持流流畅,它应该按预期工作:

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

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