Node.js дочерний процесс - разница между spawn & fork

Это может показаться основным вопросом, но я не нашел никакой документации:

В чем разница между forking и нерестом процесса node.js? Я прочитал, что forking - это особый случай нереста, но каковы различные варианты использования/рецензии для использования каждого из них?

Ответ 1

Spawn - это команда, предназначенная для запуска системных команд. Когда вы запускаете spawn, вы отправляете ему системную команду, которая будет запускаться в своем собственном процессе, но не выполняет никакого дополнительного кода внутри процесса вашего узла. Вы можете добавить прослушиватели для порожденного вами процесса, чтобы ваш код взаимодействовал с порожденным процессом, но новый экземпляр V8 не создается (если, конечно, ваша команда не является другой командой Node, но в этом случае вы должны использовать fork!) И только одна копия вашего узла модуля активна на процессоре.

Fork - это особый экземпляр spawn, который запускает свежий экземпляр двигателя V8. Это означает, что вы можете по существу создать несколько рабочих, работающих на одной и той же базе кода Node, или, возможно, другой модуль для конкретной задачи. Это наиболее полезно для создания рабочего пула. Хотя асинхронная модель событий узла позволяет достаточно эффективно использовать одно ядро машины, она не позволяет процессу узла использовать многоядерные машины. Самый простой способ сделать это - запустить несколько копий одной и той же программы на одном процессоре.

Хорошее эмпирическое правило - использование одного-двух узловых процессов на ядро, возможно, больше для машин с хорошим отношением тактовой частоты оперативной памяти к тактовой частоте или для узловых процессов, интенсивно работающих с вводом-выводом и незначительной нагрузкой на процессор, чтобы минимизировать время простоя события Цикл ждет новых событий. Однако последнее предложение является микрооптимизацией и потребует тщательного тестирования, чтобы убедиться, что ваша ситуация соответствует потребностям многих процессов/ядра. Вы можете реально снизить производительность, создавая слишком много рабочих для вашей машины/сценария.

В конечном итоге вы можете использовать spawn так, как описано выше, отправив spawn команду Node. Но это было бы глупо, потому что fork делает некоторые вещи, чтобы оптимизировать процесс создания экземпляров V8. Просто проясняю, что в конечном счете икру охватывает форк. Вилка просто оптимальна для этого конкретного и очень полезного варианта использования.

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

Ответ 2

  • spawn - child_process.spawn запускает новый процесс с данной командой.
  • fork - метод child_process.fork является частным случаем spawn() для создания дочерних процессов.

Метод spawn()

Метод child_process.spawn запускает новый процесс с заданной командой. Имеет следующую подпись -

child_process.spawn(command[, args][, options])

Подробнее об опциях

Метод spawn() возвращает потоки (stdout & stderr), и его следует использовать, когда процесс возвращает объем данных. spawn() начинает получать ответ, как только процесс начинает выполняться.

Метод fork()

Метод child_process.fork - это особый случай spawn() для создания процессов Node. Имеет следующую подпись -

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

Метод fork возвращает объект со встроенным каналом связи в дополнение к наличию всех методов в обычном экземпляре ChildProcess.

Ответ 3

TLDR

Spawn

Когда создается спаун is created - Он создает потоковый интерфейс между родительским и дочерним процессами.

средства потокового интерфейса - буферизация данных в двоичном формате

Fork

Когда создается форк is created -, он создает канал связи между родительским и дочерним процессами

.канал связи означает - обмен сообщениями

Difference

Ну, оба выглядят так же, как и при передаче данных, за исключением разницы ниже

spawn будет полезен, когда вы хотите выполнять непрерывные операции типа, такие как чтение/запись данных в потоке

форк будет полезен, когда вы хотите обмениваться сообщениями

Conslusion

spawn следует использовать для потоковой передачи больших данных/файлов/изображений ИЗ spawn процесса в родительский процесс

вилка должна использоваться для передачи сообщений Json/Xml Data.

  • Например, предположим, что процесс 10 форка создан из родительского.
  • и каждый процесс выполняет некоторую операцию
  • и каждый процесс после завершения операции отправит сообщение родительскому процессу "процесс № 4 завершен", "процесс № 8 завершен"