разветвленный дочерний процесс зависает в node.js

#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. Большое спасибо! это помогло мне решить очень загадочную ошибку в моей системе. Не осознавал, что такого рода проблемы могут возникнуть, если не использовать стандартный стандартный вывод.