Pythonの非同期プログラミングを攻略!asyncioライブラリの基本と実践活用ガイド

python asyncioガイドが登場

Pythonでネットワーク通信やファイル操作を行う際、「処理待ち時間」がネックになり、プログラム全体の速度が落ちてしまうことはありませんか?

そんな課題を解決するのが、Pythonの標準ライブラリである asyncio です。本記事では、非同期プログラミングの基礎から、現場で使える実践的なコード例までを初心者の方にも分かりやすく解説します。

目次

asyncio(非同期処理)とは?

通常、プログラミングは「1つの処理が終わってから次の処理へ進む」という同期処理で動きます。しかし、WebAPIの呼び出しやデータベース操作など、待ち時間(I/Oバウンドなタスク)が多い場合、その「待ち」の時間が無駄になってしまいます。

asyncio を使うと、1つの処理が待機している間に別の処理を進めることができ、プログラム全体の実行時間を大幅に短縮できます。

同期処理と非同期処理のイメージ

非同期処理: 注文だけ受けて番号札を渡し、料理ができるまでの間に次の人の注文を受ける。

同期処理: レジが1つしかなく、前の人の注文が終わるまで次が進まない。

asyncioの基本コンセプト:3つのキーワード

まずは、以下の3つの言葉をセットで覚えましょう。

  1. コルーチン (Coroutine): async def で定義された関数。呼び出しただけでは実行されず、予約された状態になります。
  2. イベントループ (Event Loop): 予約されたタスクを効率よく回す「司令塔」の役割。
  3. 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

python asyncioガイドが登場

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

「現役エンジニアが教える、AI時代のプログラミングを楽しく学ぶ」

Python・JavaScriptを中心に、今話題のChatGPTとPythonを組み合わせた自動化・業務効率化・最新のAI活用術を、現役のプロ目線で分かりやすく紹介。

初心者でも実践できる、現場で役立つ内容で、“自分の手で作れる”を力強く応援しています。

目次