Nodejs求教:子进程如何向主进程发消息
Nodejs求教:子进程如何向主进程发消息
使用cluster的时候,主进程可以向子进程发消息,通过worker.process.send 如果子进程向主进程发消息,该如何写呢???
当然可以。在 Node.js 中,你可以使用 process.send
方法来实现子进程向主进程发送消息。这种机制基于 IPC(进程间通信)。
示例代码
假设你有一个主进程文件 master.js
和一个子进程文件 child.js
。
主进程文件 (master.js
)
const { fork } = require('child_process');
// 创建子进程
const child = fork('child.js');
// 监听子进程的消息
child.on('message', (msg) => {
console.log('收到子进程消息:', msg);
});
console.log('主进程启动');
子进程文件 (child.js
)
// 发送一条消息给主进程
process.send({ message: 'Hello from child process!' });
console.log('子进程启动');
运行方式
- 确保两个文件(
master.js
和child.js
)在同一目录下。 - 在终端中运行
node master.js
。
解释
-
主进程 (
master.js
):- 使用
fork
方法创建子进程,并监听子进程的'message'
事件。 - 当子进程发送消息时,主进程会接收到该消息并打印出来。
- 使用
-
子进程 (
child.js
):- 使用
process.send
方法向主进程发送消息。 - 消息是一个简单的 JavaScript 对象,包含键值对。
- 使用
输出结果
当你运行 node master.js
时,你会看到类似以下的输出:
主进程启动
子进程启动
收到子进程消息: { message: 'Hello from child process!' }
总结
这种方式非常适合需要主进程和子进程之间进行简单通信的场景。通过 process.send
和 'message'
事件,可以方便地实现在 Node.js 应用中的进程间通信。
官网实例如下: 父进程:
var cp = require('child_process');
var n = cp.fork(__dirname + ‘/sub.js’);
n.on(‘message’, function(m) {
console.log(‘PARENT got message:’, m);
});
n.send({ hello: ‘world’ });
sub.js代码:
process.on('message', function(m) {
console.log('CHILD got message:', m);
});
process.send({ foo: 'bar' });
另外可以看一下我写的一个日志:http://cnodejs.org/topic/5190eb1263e9f8a542ae7b54
谢了,原来我发送写对了。接收写错了。
在Node.js中,主进程和子进程之间的通信可以通过process.send
和process.on('message')
来实现。当使用cluster
模块时,你可以利用这些方法让子进程向主进程发送消息。
示例代码
主进程代码(master.js)
const cluster = require('cluster');
const http = require('http');
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < 2; i++) {
cluster.fork();
}
// Listen to messages from workers
for (const id in cluster.workers) {
cluster.workers[id].process.on('message', (msg) => {
console.log(`Received message from worker: ${msg}`);
});
}
} else {
// Worker processes
console.log(`Worker ${process.pid} started`);
// Send a message to the master process
process.send({ hello: 'from worker' });
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
}
解释
- 主进程:首先,我们创建了两个子进程。然后,我们为每个子进程添加了一个监听器,该监听器会在接收到子进程的消息时打印出来。
- 子进程:在子进程中,我们使用
process.send()
方法向主进程发送一个简单的JSON对象。然后,启动一个HTTP服务器。
这样,当你运行node master.js
时,你会看到主进程接收到子进程发送的消息,并将其打印出来。
总结
通过process.send()
和process.on('message')
,你可以轻松地实现主进程与子进程之间的双向通信。这种方式非常适合处理需要跨进程协调的工作,例如负载均衡或分布式任务。