Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS|Cluster: How to send data from master to all or single child/workers?

I have working (stock) script from node

var cluster = require('cluster'); var http = require('http'); var numReqs = 0;  if (cluster.isMaster) {   // Fork workers.   for (var i = 0; i < 2; i++) {     var worker = cluster.fork();      worker.on('message', function(msg) {       if (msg.cmd && msg.cmd == 'notifyRequest') {         numReqs++;       }     });   }    setInterval(function() {     console.log("numReqs =", numReqs);   }, 1000); } else {   // Worker processes have a http server.   http.Server(function(req, res) {     res.writeHead(200);     res.end("hello world\n");     // Send message to master process     process.send({ cmd: 'notifyRequest' });   }).listen(8000); } 

In the above script I can send data from worker to master process with ease. But how to send data from master to the worker/workers? With examples, if it possible.

like image 643
htonus Avatar asked Dec 16 '11 12:12

htonus


1 Answers

Because cluster.fork is implemented on top of child_process.fork, you can send messages from a master to the worker by using worker.send({ msg: 'test' }), and from a worker to a master by process.send({ msg: 'test' });. You receive the messages like so: worker.on('message', callback) (from worker to master) and process.on('message', callback); (from master to worker).

Here's my full example, you can test it by browsing http://localhost:8000/ Then the worker will send a message to the master and the master will reply:

var cluster = require('cluster'); var http = require('http'); var numReqs = 0; var worker;  if (cluster.isMaster) {   // Fork workers.   for (var i = 0; i < 2; i++) {     worker = cluster.fork();      worker.on('message', function(msg) {       // we only want to intercept messages that have a chat property       if (msg.chat) {         console.log('Worker to master: ', msg.chat);         worker.send({ chat: 'Ok worker, Master got the message! Over and out!' });       }     });    } } else {   process.on('message', function(msg) {     // we only want to intercept messages that have a chat property     if (msg.chat) {       console.log('Master to worker: ', msg.chat);     }   });   // Worker processes have a http server.   http.Server(function(req, res) {     res.writeHead(200);     res.end("hello world\n");     // Send message to master process     process.send({ chat: 'Hey master, I got a new request!' });   }).listen(8000); } 
like image 162
alessioalex Avatar answered Sep 23 '22 07:09

alessioalex