node.js передает поток из (разветвленного) child_process - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь связаться с (разветвленным) дочерним процессом из в node.js.

На заднем плане я хочу запустить поток в другом потоке.

У меня естьродительский процесс nodejs, который запускает другой дочерний процесс nodejs.Дочерний процесс выполняет некоторую логику и затем возвращает вывод родительскому элементу.

Код родительского файла:

const stream = require('stream');
const Writable = stream.Writable;
const fork = require("child_process").fork;

class Logger extends Writable {
  constructor() {
    super({ objectMode: true });
  }

  _write(chunk, encoding, callBack) {
    console.log(`${Date.now()} - (payload:${chunk})`);
    callBack(null);
  }
}

const writeStream = new Logger();

const computedStream = fork('child.js', [], { silent: true });
computedStream.stdout
  .pipe(writeStream);

Код дочернего файла:

const stream = require('stream');
const Readable = stream.Readable;

class RandomNumberGenerator extends Readable {
  constructor() {
    super({ objectMode: true });
    this._count = 10;
    this._counter = 0;
  }

  _read() {
    if (this._counter === this._count) {
      return this.push(null);
    }
    const random = Math.random();
    this.push(random)

    this._counter++;
  }
}

const readStream = new RandomNumberGenerator();

readStream.pipe(process.stdout);

Вышеприведенный код печатаетничего и я жду чего-то.как это

1546139560637 - (payload:0.05907150771370184)
1546139560642 - (payload:0.395942443503438)
1546139560642 - (payload:0.7873116185362699)
...

1 Ответ

0 голосов
/ 30 декабря 2018

Я догадываюсь, что вы не можете просто console.log в другом потоке и ожидать, что он будет выводиться в главном потоке.Вам нужно будет отправить информацию обратно, а затем console.log ее в главном потоке.

Учитывая, что результаты правильно находятся внутри process.stdout

Child.js

// After all processing has finished on the child thread
process.send({ info: process.stdout });

Код родительского файла

const computedStream = fork('child.js', [], { silent: true });
computedStream.on('message', (message) => {
   console.log(`stdout of child processes is: ${message.info}`);
});

Дополнительную информацию можно найти здесь - https://itnext.io/multi-threading-and-multi-process-in-node-js-ffa5bb5cde98

...