Nodejs关于process.send()的疑惑

Nodejs关于process.send()的疑惑

本人菜鸟一个,刚开始学习nodejs,看官方关于cluster模块的message方法时,碰到如下代码码: var cluster = require(‘cluster’); var http = require(‘http’);

if (cluster.isMaster) {

// Keep track of http requests var numReqs = 0; setInterval(function() { console.log(“numReqs =”, numReqs); }, 1000);

// Count requestes function messageHandler(msg) { if (msg.cmd && msg.cmd == ‘notifyRequest’) { numReqs += 1; } }

// Start workers and listen for messages containing notifyRequest var numCPUs = require(‘os’).cpus().length; for (var i = 0; i < numCPUs; i++) { cluster.fork(); }

Object.keys(cluster.workers).forEach(function(id) { cluster.workers[id].on(‘message’, messageHandler); });

} else {

// Worker processes have a http server. http.Server(function(req, res) { res.writeHead(200); res.end(“hello world\n”);

// notify master about the request
process.send({ cmd: 'notifyRequest' });

}).listen(8000); }

其中的process.send() 让我有点纳闷,因为我看了文档中process是没有send方法的,而且我单独写也是报错说send()方法未定义,但是上面的例子确认正确运行。 请大侠们指点小弟一二,谢谢!!


7 回复

当然可以!process.send() 是 Node.js 中的一个特殊方法,主要用于在主进程(master)和工作进程(worker)之间进行通信。你提到的困惑可能是因为 process.send() 方法仅在工作进程中可用,并且通常与 cluster 模块一起使用。

示例代码

const cluster = require('cluster');
const http = require('http');

if (cluster.isMaster) {
    // 主进程逻辑
    var numReqs = 0;

    setInterval(() => {
        console.log("numReqs =", numReqs);
    }, 1000);

    function messageHandler(msg) {
        if (msg.cmd && msg.cmd === 'notifyRequest') {
            numReqs += 1;
        }
    }

    const numCPUs = require('os').cpus().length;
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    Object.keys(cluster.workers).forEach((id) => {
        cluster.workers[id].on('message', messageHandler);
    });

} else {
    // 工作进程逻辑
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end("hello world\n");

        // 通知主进程请求已到达
        process.send({ cmd: 'notifyRequest' });
    }).listen(8000);
}

解释

  1. 主进程(Master)

    • cluster.isMaster 判断当前进程是否为主进程。
    • 使用 cluster.fork() 创建多个工作进程。
    • 监听每个工作进程的消息,并调用 messageHandler 处理消息。
  2. 工作进程(Worker)

    • cluster.isMaster 返回 false,表示当前进程为工作进程。
    • 创建 HTTP 服务器,并在每次请求到达时调用 process.send() 发送消息给主进程。

关键点

  • process.send() 方法仅在工作进程中可用,用于向主进程发送消息。
  • 在工作进程中,通过 process.send() 发送的消息会被主进程监听到,并由 messageHandler 函数处理。

希望这个解释能帮助你理解 process.send() 的用法及其在主进程和工作进程之间的通信机制。如果你有任何进一步的问题,请随时提问!


大概是在子进程中才有process.send()的吧

我自己捣鼓了半天,貌似是你说的那样! var cluster = require(“cluster”); if(cluster.isMaster){ var worker = cluster.fork() worker.on(“message”, function(msg){ console.log(msg); }); }else{ process.send({as: ‘asasdf’}); } 只要这样写就可以。。。把process.send()放外面就报错

多谢了!

worker.send(message, [sendHandle]): master给worker发送消息。 注:worker给发master发送消息要用process.send(message)

worker 与worker之间有api可以通信吗?

process.send() 方法主要在 worker 进程与 master 进程之间通信时使用。这个方法在 Node.js 的 child_process 模块中实现,主要用于 WorkerMaster 之间的消息传递。

在你的例子中,process.send() 被用于在工作进程(worker process)处理完 HTTP 请求后,向主进程(master process)发送通知。以下是对代码片段的简要解释:

主进程(Master)

if (cluster.isMaster) {
    var numReqs = 0;
    setInterval(() => console.log("numReqs =", numReqs), 1000);

    function messageHandler(msg) {
        if (msg.cmd && msg.cmd === 'notifyRequest') {
            numReqs += 1;
        }
    }

    var numCPUs = os.cpus().length;
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    Object.keys(cluster.workers).forEach((id) => {
        cluster.workers[id].on('message', messageHandler);
    });
}

在这个部分,主进程创建了多个工作进程,并且监听它们的消息。每当接收到 notifyRequest 消息时,主进程会增加 numReqs 的计数并打印当前值。

工作进程(Worker)

else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end("hello world\n");

        // Notify master about the request
        process.send({ cmd: 'notifyRequest' });
    }).listen(8000);
}

在工作进程中,每当完成一次 HTTP 请求,都会通过 process.send() 发送一个包含 'cmd': 'notifyRequest' 的对象给主进程。

示例

如果你希望独立测试 process.send(),可以创建两个 Node.js 进程,一个作为主进程,另一个作为子进程。以下是一个简单的例子:

master.js

process.on('message', (msg) => {
    console.log(`Received message from child: ${msg}`);
});

setTimeout(() => {
    console.log('Sending message to child');
    process.send({ cmd: 'hello' });
}, 2000);

child.js

process.send({ cmd: 'init' });

process.on('message', (msg) => {
    console.log(`Received message from master: ${msg}`);
});

然后分别运行这两个文件:

$ node master.js &
$ node child.js

这样你就可以看到两个进程之间互相发送消息的过程。

回到顶部