Nodejs求教:子进程如何向主进程发消息

Nodejs求教:子进程如何向主进程发消息

使用cluster的时候,主进程可以向子进程发消息,通过worker.process.send 如果子进程向主进程发消息,该如何写呢???

4 回复

当然可以。在 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('子进程启动');

运行方式

  1. 确保两个文件(master.jschild.js)在同一目录下。
  2. 在终端中运行 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.sendprocess.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);
}

解释

  1. 主进程:首先,我们创建了两个子进程。然后,我们为每个子进程添加了一个监听器,该监听器会在接收到子进程的消息时打印出来。
  2. 子进程:在子进程中,我们使用process.send()方法向主进程发送一个简单的JSON对象。然后,启动一个HTTP服务器。

这样,当你运行node master.js时,你会看到主进程接收到子进程发送的消息,并将其打印出来。

总结

通过process.send()process.on('message'),你可以轻松地实现主进程与子进程之间的双向通信。这种方式非常适合处理需要跨进程协调的工作,例如负载均衡或分布式任务。

回到顶部