Skip to content

8.1 非同期処理とは

非同期処理は、一言で言えば「裏で行われる処理」であり、多くの場合「時間がかかる処理」として表現されます。CPUやメモリの外部にアクセスする処理がこれに該当し、JavaScriptのシングルスレッドモデルという実行環境の特性が深く関わっています。

8.1.1 “時間がかかる処理”としての非同期処理

Section titled “8.1.1 “時間がかかる処理”としての非同期処理”

非同期処理の典型例は、完了までに時間を要する処理です。

  • 通信: 端末とWebサーバ間のネットワーク通信や、データベースへのアクセスなどは、物理的な距離やサーバ側の処理時間によって待ち時間が発生します。
  • ファイルの読み書き: HDDやSSDへのアクセスは、CPUの処理速度に比べて非常に遅いため、時間がかかる処理と見なされます。

TypeScript(JavaScript)では、このような時間がかかる処理は一般的に非同期処理として扱われます。

8.1.2 シングルスレッドモデル・ノンブロッキング

Section titled “8.1.2 シングルスレッドモデル・ノンブロッキング”

時間がかかる処理を行うためのAPIは、大きく2種類に分類されます。

  • ブロッキング (blocking): 処理が完了するまで、プログラムの実行がその場で停止する方式です。
  • ノンブロッキング (non-blocking): 処理の完了を待たずに、プログラムが即座に次の処理へ進む方式です。TypeScriptにおける非同期処理は、基本的にこのノンブロッキングな処理を指します。

JavaScriptはシングルスレッドモデル(プログラムの複数箇所が同時に並列実行されない仕組み)を採用しているため、ブロッキング処理は好まれません。

例えばWebサーバを構築する場合、通信処理がブロッキングだと、あるクライアントの応答を待っている間プログラム全体が停止してしまい、他のクライアントに応対できず性能が著しく低下します。ノンブロッキングであれば、通信の待ち時間中もプログラムが動き続けるため、同時に複数のクライアントを処理できるようになります。

なお、実際に通信などの時間のかかる処理を行うのはOSであり、JavaScriptのアプリケーションロジック自体がシングルスレッドであっても、裏側の処理は並列に行われています。