/** @type {import('node:cluster').Cluster} */ const cluster = require("cluster"); const os = require("os"); /** * Use Round Robin algorithm for cluster process load balancer */ cluster.schedulingPolicy = cluster.SCHED_RR; async function main() { if(cluster.isPrimary == false) { // This process is a worker / slave // Compile source code and run require("./Source/index"); // stay here return; }; // This process is a primary / master // Worker process list const master = new Map(); const coreCount = 2 // os.cpus().length; for(let index = 0; index < coreCount; index++) { // Open slave process let worker = await generateFlow(); // Save process with id master.set(worker.id, worker); // Listen process for commands worker.message( // This process want to send payload to sibling process with IPC (workerId, payload) =>{ for (const [siblingWorkerId,{send}] of master) { // No sending to itself if(workerId !== siblingWorkerId) { // Send command to sibling with IPC send({ ...payload, pid: worker.id }) } } } ) } } async function generateFlow(N) { // Mirror this process with for (low-level os multitasking) const worker = cluster.fork(); // Wait process is online await new Promise(ok => { worker.addListener("online",()=> { ok() }) }); // Get process pid on the os let id = worker.process.pid; // Simplification wrapping send and get events with IPC's event functions return { id, send: message => worker.send(message), message: (callback) => worker.addListener("message", e => callback(id,e)) } } // Run immediately process.nextTick(main);