ddstats-server/libs/utils/multithread.js

76 lines
2.0 KiB
JavaScript

import { randomUUID } from 'crypto'
import { SHARE_ENV, 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', { env: SHARE_ENV }))
}
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
)
}
)
}