目的
- 業務で明確に意識できていなかったので再確認
- 今後意識するために言語化しておく
並行処理
並行処理は「複数の処理を同時に扱う」という概念で、特に複数のタスクを並行して進行させることを指します。並行処理が適している状況は、主にCPUバウンドな処理(計算が多い、データ処理など)で発揮されます。
使用シチュエーション
-
CPUバウンドな処理:
並行処理は、複数のCPUコアを活用して、並列に計算やデータ処理を行うのに向いています。例えば、データの大量処理(数値計算や画像処理、機械学習の訓練など)を複数のスレッドで並行して処理する場合に有効です。 -
マルチスレッドの活用:
複数のスレッドを使うことで、1つのタスクを分割して複数のCPUコアで並行して処理できます。これにより、計算量の大きな処理を高速化できます。 -
プロセス間での並行処理:
プロセス間でメモリを共有できない場合は、マルチプロセス(例えばPythonのmultiprocessingモジュール)を使用して並行処理を行うこともあります。これにより、並列処理を行いつつ、プロセスごとに異なるメモリ空間を利用できます。
例
-
大規模データ処理: 数百万のデータを並列に処理するタスク。
-
機械学習のパラメータチューニング: 複数のモデルやパラメータセットで並行して学習を行う。
非同期処理
非同期処理は、I/Oバウンド(例えば、ネットワーク通信やファイルシステムの操作)で非常に効果的です。非同期処理を使用することで、I/O待ちの間にCPUが他の作業を行えるようになり、システムの全体的なスループットを向上させることができます。
使用シチュエーション
-
I/Oバウンドな処理:
ファイル読み書き、データベースクエリ、HTTPリクエストなど、外部リソースとの通信を待つ時間が長い処理に最適です。例えば、APIリクエストを送信し、そのレスポンスを待つ間に他の作業を行うことができます。 -
高並列性の要求:
非同期処理は、数千〜数百万のI/O操作を同時に行いたい場合に非常に有効です。例えば、複数の外部APIからデータを同時に取得したり、非同期で複数のネットワーク通信を管理する場面で効果を発揮します。 -
イベント駆動型システム:
イベント駆動型システム(例えば、Node.jsや非同期I/Oを活用するフレームワーク)では、シングルスレッドで多数の接続を非同期で処理することができます。
例
-
Webサーバー: クライアントからのリクエストを非同期で処理し、同時に多数の接続をさばく。
-
APIリクエストの処理: 他のサーバーからのデータを非同期で取り込み、処理を続ける。
-
非同期なファイル操作: ファイルシステムへの読み書きが非同期で行われ、他のタスクを並行して実行する。
並行処理 vs 非同期処理
並行処理を使うべき場合
CPUを多く使用する処理があるとき。並行処理を使って、計算リソースを最大化できます。
並列計算をしたい場合。データの分割と並行処理が可能な場合、複数のスレッドやプロセスを使用して効率的に処理できます。
非同期処理を使うべき場合
I/O待ちの時間が多い場合。ネットワークアクセスやデータベース操作など、外部リソースとのやり取りで時間がかかる処理を非同期で行い、待ち時間中に他の処理を進めることができます。
高並列性が必要な場合。例えば、数千〜数百万のAPIリクエストを同時にさばく場合に非同期処理は非常に有効です。
参考
結論
-
並行処理は、計算リソースを活用して並列計算を行いたい場合(CPUバウンド)に最適です。
-
非同期処理は、I/O待ち時間を効率的に処理するため、I/Oバウンドな処理(ネットワーク、ファイルシステムアクセス)に有効です。