举一个简短的例子:我有一个名为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 进程发送消息吗?
答案 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可能在不久的将来发生变化。)