2021-10-14 19:20:09 +02:00
|
|
|
import { randomUUID } from 'crypto'
|
2021-10-13 16:40:18 +02:00
|
|
|
import { Worker } from 'worker_threads'
|
2021-10-16 19:11:16 +02:00
|
|
|
import initLog from './log.js'
|
|
|
|
|
|
|
|
const log = initLog("Worker Setup")
|
2021-10-13 16:40:18 +02:00
|
|
|
|
|
|
|
let workerFarm = []
|
2021-10-14 19:20:09 +02:00
|
|
|
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
|
|
|
|
)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
2021-10-13 16:40:18 +02:00
|
|
|
|
|
|
|
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({
|
2021-10-13 19:45:59 +02:00
|
|
|
type: 'initWorker',
|
2021-10-13 16:40:18 +02:00
|
|
|
name: `Worker ${parseInt(i) + 1}`
|
|
|
|
})
|
2021-10-14 19:20:09 +02:00
|
|
|
workerReady[i] = true
|
2021-10-13 16:40:18 +02:00
|
|
|
}
|
2021-10-14 19:20:09 +02:00
|
|
|
|
2021-10-16 19:11:16 +02:00
|
|
|
log(`Initialised ${threads} workers!`)
|
2021-10-13 16:40:18 +02:00
|
|
|
}
|
|
|
|
|
2021-10-13 19:45:59 +02:00
|
|
|
export function spread(script, data) {
|
|
|
|
return new Promise(
|
2021-10-14 19:20:09 +02:00
|
|
|
async (resolve, reject) => {
|
|
|
|
const readyIndex = await waitForThread()
|
|
|
|
workerReady[readyIndex] = false
|
|
|
|
|
|
|
|
const worker = workerFarm[readyIndex]
|
|
|
|
const jobID = randomUUID()
|
2021-10-13 19:45:59 +02:00
|
|
|
worker.postMessage({
|
|
|
|
type: 'runScript',
|
|
|
|
script,
|
2021-10-14 19:20:09 +02:00
|
|
|
data,
|
|
|
|
id: jobID
|
2021-10-13 19:45:59 +02:00
|
|
|
})
|
2021-10-13 16:40:18 +02:00
|
|
|
|
2021-10-14 19:20:09 +02:00
|
|
|
const messageHandler = message => {
|
|
|
|
if (message.id === jobID) {
|
|
|
|
workerReady[readyIndex] = true
|
|
|
|
worker.removeListener(
|
|
|
|
'message',
|
|
|
|
messageHandler
|
|
|
|
)
|
|
|
|
resolve(message.result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
worker.on(
|
|
|
|
'message',
|
|
|
|
messageHandler
|
|
|
|
)
|
2021-10-13 19:45:59 +02:00
|
|
|
}
|
|
|
|
)
|
2021-10-13 16:40:18 +02:00
|
|
|
}
|