Created
February 7, 2018 04:22
-
-
Save crookm/1cebef49005267fec6078771169bbfb6 to your computer and use it in GitHub Desktop.
Setup several forked processes in node.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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