Ответ 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