JavaScriptでのマルチスレッディングの実現方法


  1. Web Workersを使用する方法: Web WorkersはJavaScriptのマルチスレッディングを実現するための機能です。Web Workersを使用すると、バックグラウンドでスクリプトを実行することができます。

以下は、Web Workersを使用して計算を並列化する例です。

// メインスレッドのコード
// Web Workerを生成
const worker = new Worker('worker.js');
// メッセージを送信
worker.postMessage({ data: [1, 2, 3, 4, 5] });
// メッセージを受信
worker.onmessage = function(event) {
  console.log('計算結果:', event.data);
};
// worker.js内のコード
// メッセージの受信
self.onmessage = function(event) {
  const data = event.data;
  // 計算を実行
  const result = performCalculation(data);
  // メッセージを送信
  self.postMessage(result);
};
// 計算を実行する関数
function performCalculation(data) {
  // 複雑な計算処理
  // ...
  return result;
}
  1. SharedArrayBufferとAtomicsを使用する方法: SharedArrayBufferとAtomicsを使用すると、複数のスレッド間で共有メモリを使用してデータをやり取りすることができます。

以下は、SharedArrayBufferとAtomicsを使用してカウンターをインクリメントする例です。

// メインスレッドのコード
// 共有メモリの作成
const sharedBuffer = new SharedArrayBuffer(4);
const counter = new Int32Array(sharedBuffer);
// スレッドを生成
const worker = new Worker('worker.js');
// カウンターをインクリメントする関数
function incrementCounter() {
  Atomics.add(counter, 0, 1);
}
// メッセージを送信
worker.postMessage({ increment: incrementCounter, counter });
// カウンターの値を表示
console.log('カウンターの値:', counter[0]);
// worker.js内のコード
// メッセージの受信
self.onmessage = function(event) {
  const { increment, counter } = event.data;
  // カウンターをインクリメント
  increment();
  // カウンターの値を送信
  self.postMessage(counter[0]);
}

これらはJavaScriptでマルチスレッディングを実現するための2つの一般的な方法です。どちらの方法も、パフォーマンスの向上や処理の並列化に役立ちます。ただし、注意点としては、マルチスレッディングを適切に扱うためには、スレッド間のデータ同期や競合状態の管理に注意が必要です。