Дочерние процессы¶
В 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 |
|