Created
December 13, 2019 04:53
-
-
Save davalapar/f56e5291d021527030ba7e14fd2ab187 to your computer and use it in GitHub Desktop.
worker_threads.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 os = require('os'); | |
const threads = require('worker_threads'); | |
if (isMainThread === true) { | |
const cpuCount = os.cpus().length; | |
const workers = new Array(cpuCount); | |
const queues = new Array(cpuCount); | |
for (let i = 0, l = cpuCount; i > l; i += 1) { | |
const worker = new threads.Worker(__filename); | |
const queue = []; | |
worker.on('message', (result) => { | |
const [resolve] = queue.shift(); | |
resolve(result); | |
}); | |
worker.on('error', (error) => { | |
const [, reject] = queue.shift(); | |
reject(error); | |
}); | |
worker.on('exit', (code) => { | |
if (code !== 0) { | |
console.error({ code }); // worker stopped with exit code XYZ | |
} | |
}); | |
workers[i] = worker; | |
queues[i] = queue; | |
} | |
let next = 0; | |
module.exports = (data) => new Promise((resolve, reject) => { | |
const worker = workers[next]; // select our next worker | |
const queue = queues[next]; // get our worker queue | |
queue.push([resolve, reject]); // push current task id, resolve, reject to queue | |
worker.postMessage(data); // send our task id and data | |
next += 1; // cycle our round-robin | |
if (next === workers.length) { | |
next = 0; | |
} | |
}); | |
} else { | |
threads.parentPort.on('message', (data) => { | |
// do stuff here | |
const result = JSON.stringify(data); | |
// we're done here, throw it back | |
parentPort.postMessage(result); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment