Node.js - child_process и путаница кластера
Возьмем этот краткий пример: у меня есть файл с именем parent.js
со следующим кодом:
var child_process = require('child_process')
var forker = child_process.fork(__dirname + '/child.js')
forker.on('message', function (msg) {
console.log('PARENT got message:', msg)
})
// sends a message to the forked process?
forker.send({msg: 'Parent message.'})
Первый вопрос: Я правильно понял? child_process.fork()
возвращает процесс forker, не так ли? (например, child_process.spawn()
?)
В любом случае, здесь код для child.js
:
process.on('message', function (msg) {
console.log('CHILD got message:', msg)
})
// sends a message to the forker process? why?
process.send({msg: 'Message from the child.'})
Второй вопрос: что означает process
внутри дочернего процесса? Думаю, к текущему разветвленному процессу? Если это так, когда я вызываю process.send()
, я правильно отправляю сообщение родительскому процессу?
Третий вопрос: возьмите этот пример (упрощенная версия Node: Up and Running):
var cluster = require('cluster')
if (cluster.isMaster) {
// fork child...
var worker = cluster.fork()
worker.on('message', function (msg) {
// do stuff
})
} else if (cluster.isWorker) {
process.send(aMessage)
}
То, что я нахожу неясным, таково: worker
является видом forker
предыдущего примера? И process.send()
внутри рабочего отправляет сообщение процессу forker?
Ответы
Ответ 1
1) child_process.fork()
возвращает разветвленный процесс так же, как child_process.spawn()
возвращает вновь созданный процесс. Действительно, fork()
является просто
[...] - частный случай функции spawn()
для нереста Node процессов. Помимо наличия всех методов в обычном экземпляре ChildProcess, возвращаемый объект имеет встроенный канал связи. 1
2) process
в ребёнке относится к дочернему элементу process
. Кроме того,
В дочернем случае объект процесса будет иметь метод send(), и процесс будет генерировать объекты каждый раз, когда он получает сообщение на своем канале. 2
Итак, изнутри ребенка мы можем отправлять сообщения с помощью send(), и мы можем получить их с помощью .on('message')
. Как в вашем фрагменте.
3) Как указано в документации о модуле cluster
на Node.js:
Рабочие процессы порождаются с помощью child_process.fork method
, так что они могут связываться с родителем через IPC и обрабатывать дескрипторы сервера взад и вперед. 3
Итак, ты прав. Node кластер объединяет функции process
более удобным образом (обратите внимание, что на данный момент модуль cluster
отмечен как экспериментальный. Api может измениться в ближайшем будущем).