Skip to content

Instantly share code, notes, and snippets.

@jpoehls
Created March 29, 2012 01:48
Show Gist options
  • Select an option

  • Save jpoehls/2232358 to your computer and use it in GitHub Desktop.

Select an option

Save jpoehls/2232358 to your computer and use it in GitHub Desktop.
Simple message passing between cluster master and workers in Node.js
var cluster = require('cluster');
if (cluster.isWorker) {
console.log('Worker ' + process.pid + ' has started.');
// Send message to master process.
process.send({msgFromWorker: 'This is from worker ' + process.pid + '.'})
// Receive messages from the master process.
process.on('message', function(msg) {
console.log('Worker ' + process.pid + ' received message from master.', msg);
});
}
if (cluster.isMaster) {
console.log('Master ' + process.pid + ' has started.');
// Fork workers.
for (var i = 0; i < 2; i++) {
var worker = cluster.fork();
// Receive messages from this worker and handle them in the master process.
worker.on('message', function(msg) {
console.log('Master ' + process.pid + ' received message from worker ' + this.pid + '.', msg);
});
// Send a message from the master process to the worker.
worker.send({msgFromMaster: 'This is from master ' + process.pid + ' to worker ' + worker.pid + '.'});
}
// Be notified when worker processes die.
cluster.on('death', function(worker) {
console.log('Worker ' + worker.pid + ' died.');
});
}
@adrianseeley

Copy link
Copy Markdown

thanks! great ref.

@jnovack

jnovack commented Aug 7, 2013

Copy link
Copy Markdown

This won't work. var inside for?

worker will hold the last worker forked, not each one (specially inside the event callback).

@dazld

dazld commented Feb 5, 2014

Copy link
Copy Markdown

should work fine, as the variable is only being used inside that particular block. if it was leaking outside the block, then yes, it would be a problem (and should be in a closure, or have some kind of binding). nice example, thanks!

@ynkm169

ynkm169 commented Aug 25, 2014

Copy link
Copy Markdown

how do u pass message between workers.....pass message to master makes master a bottleneck..............

@CubixSystem

Copy link
Copy Markdown

Good example.
Need to replace this.pid for this.process.pid on newer Node versions.
Same for worker.pid

@chbdetta

chbdetta commented Aug 2, 2015

Copy link
Copy Markdown

Great example. Thanks a lot!

@danieldram

danieldram commented Jun 10, 2016

Copy link
Copy Markdown

can use os.cpus().length to get number of running workers if you do not know the exact number as indicated in the for loop.
(Be sure to var os = require('os') when using)

@saeidalidadi

saeidalidadi commented Feb 6, 2017

Copy link
Copy Markdown

I have a Map() object which I use to store on fly values for my app so how I can share this object between all workers ?
I am using .set() and .get() methods of this object also.

@Rob--

Rob-- commented Jun 4, 2017

Copy link
Copy Markdown

I've created a module to make communicating between the master and worker easier: https://github.com/Rob--/cluster-messages

@vikene

vikene commented Jun 8, 2017

Copy link
Copy Markdown

Great! thanks 👍

@BriantAnthony

Copy link
Copy Markdown

Why would workers need to communicate between other workers? Shouldn't the database be the single point of truth that each worker gets any persisted data from?

@muriloinflue

Copy link
Copy Markdown

@BriantAnthony thanks for the reminder (really)!

@mohamedelsayed

Copy link
Copy Markdown

nice example, thanks.

@cpascal-gr

Copy link
Copy Markdown

Why would workers need to communicate between other workers? Shouldn't the database be the single point of truth that each worker gets any persisted data from?

For many reasons. For example in a big project you need some parallel computing for improving performance, the database wouldn't be a solution because it would end up being a bottleneck of performance. Take a look on this DigitalOcean case study: https://medium.com/better-programming/from-15-000-database-connections-to-under-100-dfd34062da4c

Additionally, persistent data is not always the case.

@svkrclg

svkrclg commented Feb 24, 2021

Copy link
Copy Markdown

Just to NOTE: workers keep on sending some internal nodejs related data to the master, so keep a check on msg key

@oneEyedSunday

Copy link
Copy Markdown

Great stuff.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment