generated at
複数のWeb Workerに処理を分散させるscript
外部からは普通のWeb Workerとして使えて、内部で複数のWebWorkerに処理を分散させるscript
(WIP)external-completionの計算処理を分散させるのに使いたい

Interface
js
const calculate = createMultiWorker('worker-src'); const promises = calculate([{foo: 'bar', baz: 'hoge'},...]); await Promise.all(promises.then(result => ...));
createMultiWorker() ;
WebWorkerを生成し、それを使った処理関数 calculate を返す
内部ではnavigator.hardwareConcurrencyの数だけWebWorkerを生成する
calculate()
Worker.postMessag()に渡すparameterのlistを渡すと、内部で適当に分散させて計算してくれる
戻り値に内部のWebWorkerの個数分のPromiseを返す
それぞれのPromiseを解決すると、処理結果が返ってくる
WebWorker側のcodeでは、 message.data で受け取る
script.js
export function createMultiWorker(workerSrc) { const workers = [...Array(navigator.hardwareConcurrency)] .map(_ => new Worker(workerSrc)); return (messages) => { const promises = []; // messagesを分割する const chunkLength = Math.floor(messages.length/workers.length) + 1; for (let i = 0; i < workers.length; i++) { const chunk = messages.slice(i * chunkLength, (i + 1) * chunkLength)); promises.push(new Promise((resolve) => { worker[i].postMessage(chunk); worker[i].addEventListener('message', ({data}) => resolve(data), {once: true}); }); } return promises; }; }