45 lines
1.1 KiB
JavaScript
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())
|