Skip to content

Instantly share code, notes, and snippets.

@crookm
Created February 7, 2018 04:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save crookm/1cebef49005267fec6078771169bbfb6 to your computer and use it in GitHub Desktop.
Save crookm/1cebef49005267fec6078771169bbfb6 to your computer and use it in GitHub Desktop.
Setup several forked processes in node.js
const { fork } = require('child_process');
let awaiting = {}; // array of payload ids awaiting responses from workers
let awaiting_lastid = 1; // incrementing payload ids
let worker_pool = [];
function sendPayload(id, payload) {
payload.id = awaiting_lastid++; // set and add id
awaiting[payload.id] = { worker: id, date: Date.now() }
worker_pool[id].send(payload);
}
function receivePayload(id, payload) {
switch (payload.type) {
case 'meta.acknowledged':
// the worker responded to our request
delete awaiting[payload.obj.id];
break;
case 'error':
// worker sent an error
console.warn(`${id} error (${payload.obj.errcode}):`);
console.warn(payload.obj.errmsg);
console.warn('');
break;
default:
console.warn(`${id} sent unknown payload type`);
break;
}
}
function setupWorkerPool(count = 4) {
for (let i = 0; i < count; i++) {
let worker = fork('./worker.js');
worker.on('message', payload => receivePayload(i, payload));
worker_pool.push(worker);
sendPayload(i, { type: 'id.set', obj: { id: `${process.pid}__${i}` } });
}
}
setupWorkerPool();
// Keep the program running forever (ctrl+c to exit)
setInterval(() => {}, Number.POSITIVE_INFINITY);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment