1. ホーム
  2. ジャバスクリプト

[解決済み】なぜJavaScriptはマルチスレッドをサポートしないのですか?

2022-03-28 11:14:03

質問

これは意図的な設計上の決定なのでしょうか、それとも現在のブラウザの問題で、今後のバージョンで修正されるのでしょうか?

解決方法は?

ブラウザの JavaScript インタプリタがシングルスレッドであるため、JavaScript はマルチスレッドをサポートしていません (AFAIK)。Google Chromeでさえ、1つのウェブページのJavaScriptを同時に実行させません。これは、既存のウェブページに大規模な並行処理の問題を引き起こすからです。Chromeは複数のコンポーネント(異なるタブ、プラグインなど)を別々のプロセスに分離しているだけで、1つのページが複数のJavaScriptスレッドを持つとは想像できません。

しかし、提案されたように、使用することができます。 setTimeout を使用すると、ある種のスケジューリングと「偽の」同時並行性が可能になります。これにより、ブラウザはレンダリング スレッドの制御を取り戻し、JavaScript コードを setTimeout を指定したミリ秒後に実行します。これは、ビューポート(目に見えるもの)に対する操作の実行中に、ビューポートを更新させたい場合に非常に便利である。例えば座標をループして、それに応じて要素を更新するだけでは、開始と終了の位置が表示されるだけで、その間に何も表示されません。

JavaScriptの抽象化ライブラリを使って、同じJavaScriptインタプリタによって管理されるプロセスやスレッドを作成することができるのです。これにより、以下のような方法でアクションを実行することができます。

  • プロセスA, スレッド1
  • プロセスA、スレッド2
  • プロセスB、スレッド1
  • プロセスA、スレッド3
  • プロセスA、スレッド4
  • プロセスB、スレッド2
  • プロセスAを一時停止
  • プロセスB、スレッド3
  • プロセスB、スレッド4
  • プロセスB、スレッド5
  • プロセスAを開始
  • プロセスA、スレッド5

これにより、何らかの形でスケジューリングが可能になり、並列処理やスレッドの起動・停止などを偽装することができますが、真のマルチスレッドにはなりません。真のマルチスレッドは、ブラウザが1つのページをマルチスレッド(あるいは複数のコア)で実行できる場合にのみ有効であり、そこでの困難さは余分な可能性よりもはるかに大きいからです。

JavaScriptの未来については、こちらをご覧ください。 https://developer.mozilla.org/presentations/xtech2006/javascript/