複数のWeb Workerに処理を分散させるscript
外部からは普通のWeb Workerとして使えて、内部で複数の
WebWorkerに処理を分散させるscript
Interface
jsconst calculate = createMultiWorker('worker-src');
const promises = calculate([{foo: 'bar', baz: 'hoge'},...]);
await Promise.all(promises.then(result => ...));
createMultiWorker()
;
WebWorkerを生成し、それを使った処理関数 calculate
を返す
calculate()
戻り値に内部のWebWorkerの個数分のPromiseを返す
それぞれのPromiseを解決すると、処理結果が返ってくる
WebWorker側のcodeでは、 message.data
で受け取る
script.jsexport 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;
};
}