import { randomUUID } from 'crypto' import { Worker } from 'worker_threads' import initLog from './log.js' const log = initLog("Worker Setup") let workerFarm = [] let workerReady = [] function waitForThread() { return new Promise( (resolve, reject) => { let interval = setInterval( () => { const readyIndex = workerReady.indexOf(true) if (readyIndex !== -1) { clearInterval(interval) resolve(readyIndex) } }, 50 ) } ) } export function initWorkers(threads) { for (let i = 0; i < threads; ++i) { workerFarm.push(new Worker('./libs/utils/multithread/genericWorker.js')) } for (const i in workerFarm) { const worker = workerFarm[i] worker.postMessage({ type: 'initWorker', name: `Worker ${parseInt(i) + 1}` }) workerReady[i] = true } log(`Initialised ${threads} workers!`) } export function spread(script, data) { return new Promise( async (resolve, reject) => { const readyIndex = await waitForThread() workerReady[readyIndex] = false const worker = workerFarm[readyIndex] const jobID = randomUUID() worker.postMessage({ type: 'runScript', script, data, id: jobID }) const messageHandler = message => { if (message.id === jobID) { workerReady[readyIndex] = true worker.removeListener( 'message', messageHandler ) resolve(message.result) } } worker.on( 'message', messageHandler ) } ) }