2016-04-25 2 views
3

У меня есть приложение node.js, которое получает файл через веб-запрос, а затем применит процесс преобразования к этому файлу. Поскольку задача длительная, это необходимо выполнить отдельно от основного потока.Функция node.js run в дочернем процессе?

На данный момент я только что назвал необходимый код с помощью вызова setTimeout(). Чтобы изолировать основное приложение от процесса преобразования, я хотел бы переместить его в дочерний процесс, поскольку он длительный, и я хотел бы выделить основной код из выполняемой работы (я слишком беспокоюсь?). На данный момент я звоню:

const execFile = require('child_process').execFile; 
const child = execFile('node', './myModule.js', (error, stdout, stderr) => { 
    if (error) { 
    throw error; 
    } 
    console.log(stdout); 
}); 

Является ли это правильный подход в Node.js, или есть просто начать дочерний процесс с модулем и Params указанных, но не должны указывать «узел» как исполняемый файл?

+0

У вас есть особые проблемы с этим подходом? Это один из нескольких способов начать новый процесс ('.spawn()' и '.exec()' похожи). Я могу сказать вам, что ваша ошибка «throw» не делает ничего полезного, поскольку бросать обычный асинхронный обратный вызов нельзя найти где-нибудь полезным, поэтому он ничего не делает, кроме 'return'. – jfriend00

+0

Является ли ваш долговременный процесс привязанным к процессору или привязанным к IO? Ответ на этот вопрос очень важен для определения того, какой подход к использованию. – JLRishe

+0

Я основывал вышеуказанный код на примере, который у меня был. Я надеялся избежать явной ссылки на команду «node», но если это не рассматривается как проблема, тогда я в порядке. Что касается CPU/IO, это процесс преобразования видео, поэтому, вероятно, немного того и другого. Хотя, теперь я вижу, что процесс преобразования видео на самом деле порождает внешний процесс (ffmpeg) под капотом, поэтому мне может не понадобиться беспокоиться о forking (я думал, что он использует библиотеку). –

ответ

2

Только что видел, что node.js предоставляет функцию «fork» для выполнения модулей, хотя они должны быть записаны так, как если бы они ожидали аргументы командной строки, обрабатывая массив process.argv.

Команда вызова существо:

child_process.fork(modulePath[, args][, options]) 

Подробнее here.

В моем конкретном случае forking, вероятно, не имеет смысла, так как уже имеется библиотека for.js, которую я использую.

+0

Является ли каждое отдельное сообщение полностью изолированным от другого? то есть, если я отправлю два сообщения в дочерний процесс процесса, они будут работать полностью независимо друг от друга? – narruc

Смежные вопросы