Node.js - child_process和群集混淆

时间:2013-08-24 10:27:50

标签: javascript node.js concurrency

举一个简短的例子:我有一个名为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 个答案:

答案 0 :(得分:10)

1)child_process.fork()以与child_process.spawn()返回新生成的进程相同的方式返回分叉进程。的确,fork()只是

  

[...]用于生成节点进程的spawn()功能的特例。除了在普通的ChildProcess实例中拥有所有方法之外,返回的对象还内置了一个通信通道。1

2)孩子process指的是孩子process。此外,

  

在子进程中,进程对象将有一个send()方法,进程每次在其通道上收到消息时都会发出对象。2

因此,我们可以通过'send()'发送消息,我们可以通过.on('message')接收消息。就像你的代码片段一样。

3)如关于Node.js上的cluster模块的文档中所述:

  

使用child_process.fork method生成工作进程,以便它们可以通过IPC与父进程通信并来回传递服务器句柄。 3

所以你是对的。节点集群以更有用的方式包装process的功能(请注意,此时cluster模块被标记为实验.Api可能在不久的将来发生变化。)