8章非同期プログラミングと並行、並列処理
ここまで本書では、主に同期プログラム(synchronous program)——何らかの入力を取り、何らかの処理を行い、完了に至るまで一本道で実行されるプログラム——を扱ってきました。しかし、本当に興味深いプログラム——ネットワーク要求を行ったり、データベースやファイルシステムの入出力を扱ったり、ユーザーとの対話に応答したり、CPU負荷の高い作業を別々のスレッドに振り分けたり、といった現実世界のアプリケーションの基礎的要素——はすべて、コールバック、プロミス、ストリームなどの非同期API(asynchronous API)を利用しています。
これらの非同期タスクは、JavaScriptが真に輝きを放つ分野で、JavaやC++のような主流のマルチスレッド言語から、それ自身を際立たせているものです。V8やSpiderMonkeyのようなポピュラーなJavaScriptエンジンは、他のタスクがアイドル状態にある間、1つのスレッド上にタスクを賢く多重化させることで、従来、多くのスレッドを必要としていた処理を1つのスレッドで行います。このイベントループ(event loop)は、JavaScriptエンジンにとって標準的なスレッドモデルであり、おそらく読者も使用しているはずです。エンドユーザーの観点からすると、エンジンがイベントループのモデルを使用しているのか、それともマルチスレッドのモデルを使用しているのかは、通常は重要ではありません。しかしこれから説明するところの、さまざまなものがどのように機能するのか、さまざまなものをどのように設計すべきか、という議論には影響を及ぼします。
このイベントループの並行(concurrency)モデルは、マルチスレッドプログラミングに固有のよくある問題や、同期されるデータ型、ミューテックス、セマフォなど、マルチスレッドに関するあらゆるものによるオーバーヘッドをJavaScriptが回避するための方法です。また、複数のスレッドにまたがってJavaScriptを実行する場合、共有メモリーはめったに使われません。よくあるパターンは、メッセージパッシング(メッセージの受け渡し)を使い、スレッド間でデータを送信するときにそれをシリアライズすることです。これは、Erlang、アクターシステム、その他の純粋な関数型の並行モデルを想起させる設計であり、JavaScriptでのマルチスレッドプログラミングを誰でも扱えるようにするものです。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access