Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-子进程和集群混淆_Javascript_Node.js_Concurrency - Fatal编程技术网

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)
}