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 может измениться в ближайшем будущем).