👷

Web Workers — JavaScriptでマルチスレッドを使う方法

postMessageの構造化複製(Structured Clone)とSharedArrayBuffer

JavaScriptはシングルスレッド。メインスレッドで重い計算するとUIが止まる。Web Workerがこれを解決。

postMessageのデータ転送方式

構造化複製(デフォルト):ディープコピー。1GB配列=1GBコピーコスト。

Transferable Objects:所有権移転。コピーなし、ただし元は使用不可に。

SharedArrayBuffer:共有メモリ。両スレッドが同じメモリに同時アクセス。Atomics APIで同期。COOP/COEPヘッダー必要。

DOMアクセス不可

Workerではdocumentwindowがない。UI操作はpostMessageで結果をメインに送って処理。

TooscutがWorkerを使う理由

先述のTooscut映像エディタがOffscreenCanvasをWorkerにtransferし、Worker内でWASMコンポジターでWebGPUレンダリングするのがまさにこのパターン。

キーポイント

1

new Worker("worker.js")で別スレッド生成

2

postMessageでデータ送信 — 構造化複製(デフォルト)またはTransferable(所有権移転)

3

Workerで計算後postMessageで結果返却

4

SharedArrayBufferで共有メモリ — Atomicsで同期(COOP/COEP必須)

ユースケース

画像処理 — リサイズ/フィルターをWorkerで実行しUIが止まらないように WASM推論 — AIモデル推論をWorkerで実行(background-removal-jsパターン)

参考資料