分叉的 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()
。
我在使用 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()
。