Дочерние процессы¶
В Node.js дочерние процессы создаются для выполнения ресурсоемких операций, которые во время выполнения блокируют цикл событий основного процесса. Создаваемые дочерние процессы полностью независимы от родительского процесса и имеют свои собственные экземпляры V8 и выделенные мощности процессора и объем памяти.
Для создания дочернего процесса в Node.js используется встроенный модуль child_process и его методы spawn() и fork(), каждый из которых возвращает экземпляр класса ChildProcess.
child_process.spawn()¶
Метод child_process.spawn() создает новый дочерний процесс (не обязательно Node.js) командой, переданной ему в качестве параметра. Вторым параметром можно передать массив аргументов команды.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Практически всегда в качестве дополнительного процесса вам придется запускать модуль Node.js. Для этого вместо метода child_process.spawn() используйте child_process.fork().
child_process.fork()¶
Метод child_process.fork() является частным случаем метода child_process.spawn(), только вместо команды он принимает путь к модулю, который должен быть запущен как новый процесс. Вторым параметром передается массив аргументом для запуска модуля.
app.js
1 2 3 4 5 6 7 8 9 10 11 | |
child.js
1 | |
Для запуска примера выполните команду.
1 | |
В результате в консоли вы должны увидеть следующее.
1 2 3 4 | |
Для взаимодействия основного и дочернего процессов используется метод send(), который устанавливает между процессами IPC канал для обмена сообщениями и параметром принимает данные для отправки другому процессу. Переданные данные являются аргументами для callback-функции, определяемой для обработки сообщения.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
child.js
1 2 3 4 5 6 7 | |
Результат должен быть таким.
1 2 3 | |
Завершение дочернего процесса можно инициировать вызовом метода disconnect() или exit(). Вызов disconnect() закроет IPC канал для обмена сообщениями, сгенерирует событие disconnect и завершит процесс после выполнения всех его операций.
Внесем изменения в предыдущий пример в файл child.js.
1 2 3 4 5 6 7 8 | |
Теперь в консоли должна быть выведена дополнительная строка.
1 | |