Spawn - это команда, предназначенная для запуска системных команд. Когда вы запускаете spawn, вы отправляете ему системную команду, которая будет запускаться в собственном процессе, но не будет выполнять никакого дополнительного кода в процессе вашего узла. Вы можете добавить слушателей для порожденного вами процесса, чтобы ваш код мог взаимодействовать с порожденным процессом, но новый экземпляр V8 не создается (если, конечно, ваша команда не является другой командой Node, но в этом случае вы должны использовать fork!) И на процессоре активна только одна копия вашего узлового модуля.
Fork - это особый экземпляр spawn, который запускает новый экземпляр двигателя V8. Это означает, что вы можете создать несколько воркеров, работающих на одной и той же кодовой базе Node, или, возможно, в другом модуле для конкретной задачи. Это наиболее полезно для создания пула рабочих. Хотя модель асинхронных событий узла позволяет достаточно эффективно использовать одно ядро машины, она не позволяет процессу узла использовать многоядерные машины. Самый простой способ добиться этого - запустить несколько копий одной и той же программы на одном процессоре.
Хорошее эмпирическое правило - от одного до двух узловых процессов на ядро, возможно, больше для машин с хорошим соотношением тактовой частоты оперативной памяти и тактовой частоты процессора, или для узловых процессов, которые сильно загружают ввод-вывод и мало работают с процессором, чтобы минимизировать время простоя события цикл ждет новых событий. Однако последнее предложение представляет собой микрооптимизацию и потребует тщательного тестирования, чтобы убедиться, что ваша ситуация соответствует потребностям многих процессов / ядра. Фактически вы можете снизить производительность, создав слишком много воркеров для вашей машины / сценария.
В конце концов, вы можете использовать spawn так же, как описано выше, отправив spawn команду Node. Но это было бы глупо, потому что fork делает некоторые вещи для оптимизации процесса создания экземпляров V8. Просто поясняю, что в конечном итоге spawn включает вилку. Fork оптимален для этого конкретного и очень полезного варианта использования.
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
var child = require('child_process').fork('child.js');
например, в моем основном приложении, у меня теперь будет работать 2 отдельных ядра. Если бы мне пришлось запустить тяжелый цикл for в child.js (процессе), я бы, по сути, использовал больше ядер для работы child.js, верно? Будет ли это использование процессора влиять на мое основное ядро приложения?