Как я могу выполнить модуль 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 вместо этого? В обоих случаях, как передать аргументы дочернему процессу - например, изображение?
Ответы
Ответ 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
.