Pythonでネットワーク通信やファイル操作を行う際、「処理待ち時間」がネックになり、プログラム全体の速度が落ちてしまうことはありませんか?
そんな課題を解決するのが、Pythonの標準ライブラリである asyncio です。本記事では、非同期プログラミングの基礎から、現場で使える実践的なコード例までを初心者の方にも分かりやすく解説します。
asyncio(非同期処理)とは?
通常、プログラミングは「1つの処理が終わってから次の処理へ進む」という同期処理で動きます。しかし、WebAPIの呼び出しやデータベース操作など、待ち時間(I/Oバウンドなタスク)が多い場合、その「待ち」の時間が無駄になってしまいます。
asyncio を使うと、1つの処理が待機している間に別の処理を進めることができ、プログラム全体の実行時間を大幅に短縮できます。
同期処理と非同期処理のイメージ
非同期処理: 注文だけ受けて番号札を渡し、料理ができるまでの間に次の人の注文を受ける。
同期処理: レジが1つしかなく、前の人の注文が終わるまで次が進まない。
asyncioの基本コンセプト:3つのキーワード
まずは、以下の3つの言葉をセットで覚えましょう。
- コルーチン (Coroutine):
async defで定義された関数。呼び出しただけでは実行されず、予約された状態になります。 - イベントループ (Event Loop): 予約されたタスクを効率よく回す「司令塔」の役割。
- await: 「この処理(コルーチン)が終わるまで待機し、その間に他の仕事をしていいよ」という合図。
【実践】asyncioのコードを書いてみよう
では、実際に動くコードを見てみましょう。Python 3.7以降で推奨されている最新の書き方です。
基本の「Hello World」
import asyncio
async def say_hello():
print("こんにちは!")
await asyncio.sleep(1) # 1秒間、非同期で待機
print("1秒経ちました!")
# メインのエントリーポイント
if __name__ == "__main__":
asyncio.run(say_hello())
複数のタスクを同時に実行する(並行処理)
複数のWebリクエストをシミュレーションした例です。asyncio.gather を使うのがポイントです。
import asyncio
import time
async def fetch_data(id, delay):
print(f"タスク {id}: データ取得開始...")
await asyncio.sleep(delay)
print(f"タスク {id}: {delay}秒後に完了!")
return f"Data from {id}"
async def main():
start_time = time.perf_counter()
# 3つのタスクを同時に走らせる
results = await asyncio.gather(
fetch_data(1, 3),
fetch_data(2, 1),
fetch_data(3, 2)
)
end_time = time.perf_counter()
print(f"結果一覧: {results}")
print(f"全体の実行時間: {end_time - start_time:.2f} 秒")
if __name__ == "__main__":
asyncio.run(main())
ポイント:
同期処理なら合計6秒(3+1+2)かかるところが、非同期なら一番長いタスクに合わせた約3秒で終わります。
エラー処理とデバッグのコツ
非同期処理でエラーが発生した場合、どこで止まったか分かりにくいことがあります。基本的な例外処理(try-except)は同期処理と同じように使えます。
async def risky_task():
try:
await asyncio.sleep(1)
raise ValueError("エラー発生!")
except ValueError as e:
print(f"キャッチしました: {e}")
パフォーマンスを最大化するための注意点
asyncio は万能ではありません。使うべき場面を見極めるのがプロのコツです。
- 向いていること(I/Oバウンド): * Web APIからのデータ取得
- データベースへの読み書き
- ファイルの入出力
- 向いていないこと(CPUバウンド): * 大量の数値計算
- 画像処理
- これらは
multiprocessing(マルチプロセス)を使うのが正解です。
まとめ:asyncioで一歩先のPythonエンジニアへ
asyncio をマスターすると、スケーラブルで高速なアプリケーションが開発できるようになります。まずは async/await に慣れ、小さなタスクの並行処理から試してみてください。
さらに詳しく学びたい方は、非同期HTTPクライアントの aiohttp や、高速なWebフレームワーク FastAPI を触ってみるのもおすすめです。
Source
https://www.kdnuggets.com/getting-started-with-pythons-asyncio-library

