Javascript Node.js-子进程和集群混淆
举个简单的例子:我有一个名为Javascript Node.js-子进程和集群混淆,javascript,node.js,concurrency,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 fo
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\u process.fork()
返回forker进程,不是吗?(如子进程.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.send()
时,我正在向父进程发送消息,对吗
第三个问题:举个例子(简化版):
我发现不清楚的是:worker
是上一个例子中的forker
?工作进程内部的process.send()
向forker进程发送消息?1)child\u进程。fork()
以与child\u进程相同的方式返回forke进程。spawn()
返回新生成的进程。实际上,fork()
只是
[…]生成节点进程的spawn()
功能的特例。除了在一个普通的ChildProcess实例中拥有所有方法外,返回的对象还内置了一个通信通道
2) 子级中的进程
指子级进程
。而且
在子进程中,进程对象将有一个send()方法,进程每次在其通道上接收消息时都会发出对象
因此,在子系统中,我们可以使用“send()”发送消息,也可以使用.on('message')
接收消息。就像你的片段一样
3) 如Node.js上的集群
模块文档所述:
工作进程是使用child_process.fork方法生成的,因此它们可以通过IPC与父进程通信,并来回传递服务器句柄
所以你是对的。节点集群以更有用的方式包装了进程的功能(请注意,此时,集群模块被标记为实验性的。Api在不久的将来可能会更改)。Ok,因此当我在工作进程内设置进程.on('message')
时,我会从主进程发送的消息中侦听,当我喜欢主进程中的cluster.fork().on('message')
时,具体会发生什么?在第二种情况下,谁监听谁发送的消息?子进程,因为cluster.fork()
返回一个子进程。实际上,通过玩这个代码,它最终通过执行cluster.fork().on('message')
,它是主进程监听刚刚分叉的进程发送的消息(使用process.send())
)。为了侦听来自主机的消息,主机应该执行cluster.fork().send()
,而工作进程应该执行process.on('message')
(或cluster.worker.on('message')
)。子进程、集群仍然让我感到困惑
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)
}