#node.js #fork #child-process
#node.js #разветвление #дочерний процесс
Вопрос:
Я столкнулся с некоторыми проблемами с разветвлением child_process, я думаю, это похоже на stdio.
после того, как я разветвляюсь с помощью некоторого кода js, дочерние работы запрашивают потоковые данные, а затем получают данные, просто передавая данные родительскому. когда я добавил журналы в дочерний процесс, после регистрации «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('exitn', 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:
Когда вы переходите silent: true
к child_process.fork()
, каналы используются между родительским и дочерним. В вашем родительском скрипте вы никогда не читаете из дочерних потоков (особенно из стандартного вывода), поэтому в какой-то момент внутренний буфер заполняется, и встроенный механизм обратного давления приводит к тому, что процесс перестает принимать выходные данные от дочернего процесса.
Добавьте что-то подобное в свой родительский скрипт, чтобы потоки продолжали течь, и он должен работать должным образом:
child.stdout.resume();
child.stderr.resume();
Этот конкретный результат будет просто игнорировать вывод. Если вам нужен вывод, вам следует добавить 'data'
обработчики событий или часто вызывать .read()
потоки.
Комментарии:
1. Большое вам спасибо! Я не нашел буфер потока потока, даже, я думаю, буфер потока.
2. Большое спасибо! это помогло мне решить очень загадочную ошибку в моей системе. Не осознавал, что такого рода проблемы могут возникнуть, если не использовать стандартный стандартный вывод.