Подтвердить что ты не робот

Как я могу выполнить модуль node.js в качестве дочернего процесса программы node.js?

Вот моя проблема. Я реализовал небольшой script, который выполняет некоторые тяжелые вычисления, как модуль node.js. Итак, если я набираю "node myModule.js", он вычисляет на секунду, а затем возвращает значение. Теперь я хочу использовать этот модуль из моей основной программы node.JS. Я мог бы просто поместить все вычисления в функцию "doSomeCalculation", а затем сделать:

var myModule = require("./myModule");
myModule.doSomeCalculation();

Но это будет блокировать, поэтому было бы плохо. Я бы хотел использовать его неблокирующим способом, например, например, вызовы DB. Поэтому я попытался использовать child_process.spawn и exec, например:

var spawn = require("child_process").spawn;
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ });
ext.on("exit", function() { console.log("calculation over!"); });

Но, конечно, это не сработает. Я попытался использовать EventEmitter в myModule, испустив события "calculateDone" и попытавшись добавить связанный прослушиватель в переменную "ext" в приведенном выше примере. Все еще не работает.

Что касается вилок, они не совсем то, что я пытаюсь сделать. Форкс потребует ввода кода, связанного с вычислением, в основную программу, форсинга, вычисления в дочернем элементе, в то время как родитель делает все, что он делает, а затем как я могу вернуть результат?

Итак, вот мой вопрос: могу ли я использовать дочерний процесс для выполнения неблокирующего вычисления, когда вычисление помещается в файл Node, или это просто невозможно? Должен ли я делать тяжелый расчет в Python script вместо этого? В обоих случаях, как передать аргументы дочернему процессу - например, изображение?

4b9b3361

Ответ 1

Я думаю, что вам нужен child_process.fork() API.

Например, если у вас есть следующие два файла:

В main.js:

var cp = require('child_process');
var child = cp.fork('./worker');

child.on('message', function(m) {
  // Receive results from child process
  console.log('received: ' + m);
});

// Send child process some work
child.send('Please up-case this string');

В файле worker.js:

process.on('message', function(m) {
  // Do work  (in this case just up-case the string
  m = m.toUpperCase();

  // Pass results back to parent process
  process.send(m.toUpperCase(m));
});

Затем запустить main (и создать дочерний рабочий процесс для кода worker.js...)

$ node --version
v0.8.3

$ node main.js 
received: PLEASE UP-CASE THIS STRING

Ответ 2

Неважно, что вы будете использовать в качестве ребенка (Node, Python, что угодно), Node не волнует. Просто убедитесь, что ваше вычисление script завершается после того, как все сделано, а результат записывается в stdout.

Причина, по которой он не работает, заключается в том, что вы используете spawn вместо exec.