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()方法未定义,但是上面的例子确认正确运行。 请大侠们指点小弟一二,谢谢!!
当然可以!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);
}
解释
-
主进程(Master)
cluster.isMaster
判断当前进程是否为主进程。- 使用
cluster.fork()
创建多个工作进程。 - 监听每个工作进程的消息,并调用
messageHandler
处理消息。
-
工作进程(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
模块中实现,主要用于 Worker
和 Master
之间的消息传递。
在你的例子中,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
这样你就可以看到两个进程之间互相发送消息的过程。