Files
2026-07-13 12:48:55 +08:00

45 lines
1.1 KiB
JavaScript

import { Worker } from 'worker_threads'
import os from 'os'
import { fileURLToPath } from 'url'
import path from 'path'
const cpus = os.cpus().length
const dir = path.dirname(fileURLToPath(import.meta.url))
class Pool {
constructor() {
this.workers = []
for (let i = 0; i < cpus; i += 1) {
this.workers.push(new Worker(dir + '/worker.js'))
// this.workers.push(new Worker(dir + '/lookup-worker.js'))
}
}
do(msg) {
const ps = this.workers.map(w => {
return new Promise(resolve => {
w.on('message', res => {
w.removeAllListeners('message')
resolve(res)
})
w.postMessage(msg)
})
})
return Promise.all(ps).then(nums => {
// console.log(nums)
let avg = nums.reduce((h, n) => h + n, 0) / nums.length
avg = Math.round(avg * 10) / 10
return avg
})
}
count() {
return this.workers.length
}
close() {
this.workers.forEach(w => w.terminate())
}
}
export default Pool
// let p = new Pool()
// p.do("hey now, you're a rockstar").then(() => p.close())