Pythonを使った非同期処理について
非同期処理 (Asynchronous Processing) とは、あるタスクを実行している最中に、そのタスクの完了を待たずに別のタスクを開始できる処理方式のことです。
例えば、今回はスーパーマーケットでのレジで考えてみましょう。
同期的なレジ(一般的なレジ)
普通のレジは同期的に動いています。
-
あなた(お客さん1)がレジに商品を置きます。
-
店員さんが商品のスキャンを始め、終わらせます。
-
店員さんが合計金額を伝え、あなたがお財布から現金を探したり、クレジットカードを用意したりします。この間、店員さんとレジはあなたを待っています。後ろのお客さんもただ待っています。
-
あなたが支払いを済ませます。
-
あなたが商品を袋に詰めます。(お店によっては店員さんが手伝いますが、それでも時間がかかります)
-
すべての工程が完全に終わってから、ようやく次のお客さん2の対応が始まります。
このように、一つのタスク(あなた一人の会計)が完了するまで、次のタスクに進めないのが同期処理です。お客さんが財布を探す「待ち時間」に、レジ全体が停止してしまいます。
非同期的なレジ(最新のセルフスキャン&セルフレジシステム)
もし、スーパーが最新の非同期的なシステムを導入したらどうなるでしょう。
-
スキャンエリアで、あなた(お客さん1)が商品のスキャンを始めます。
-
スキャンが終わると、あなたは会計エリアの空いている会計機に進みます。
-
あなたが会計機でお金の支払いをしている間に、スキャンエリアが空くので、すぐにお客さん2がスキャンを開始できます。
-
さらに、あなたの支払いが終わると、あなたは袋詰めエリアに移動します。
-
あなたが袋詰めをしている間に、お客さん2は支払いを済ませ、お客さん3がスキャンを開始できます。
これが非同期処理です。非同期処理は待機時間を有効活用することで効率的にタスク処理を行っていきます。
具体的なコードを見てみましょう。
Pythonの非同期処理(asyncio)を使って、複数のタスクを同時に実行するサンプルコードです。
import asyncio
import time
# 非同期で実行するタスクを定義
async def task(name, delay):
print(f"タスク {name}: 開始")
# ここで待機している間に、他のタスクが実行されます。
await asyncio.sleep(delay)
print(f"タスク {name}: 完了 ({delay}秒後)")
# すべてのタスクを実行するメインの関数
async def main():
print("すべてのタスクを同時に開始します")
start_time = time.time()
# asyncio.gather()は、複数のタスクを並行して実行します
await asyncio.gather(
task("A", 3), # タスクAは3秒かかります
task("B", 1), # タスクBは1秒かかります
task("C", 2) # タスクCは2秒かかります
)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"\nすべてのタスクが完了しました。合計時間: {elapsed_time:.2f}秒")
# プログラムを実行
if __name__ == "__main__":
asyncio.run(main())