Python の async/await の基本

async と await を使うと、非同期処理を同期的なコードのように書けます。I/O 待ちの多い処理で効率が向上します。

基本構文

async def で非同期関数(コルーチン関数)を定義し、await で非同期処理の完了を待ちます。

import asyncio

async def greet(name):
    await asyncio.sleep(1)  # 1秒待機(非同期)
    return f"Hello, {name}!"

async def main():
    result = await greet("Alice")
    print(result)

asyncio.run(main())

並行実行

複数の非同期処理を並行して実行できます。

import asyncio

async def fetch(url, delay):
    await asyncio.sleep(delay)
    return f"Fetched {url}"

async def main():
    tasks = [
        fetch("url1", 2),
        fetch("url2", 1),
        fetch("url3", 3),
    ]
    results = await asyncio.gather(*tasks)
    for r in results:
        print(r)

asyncio.run(main())

3 つの処理が並行して実行されるため、合計 3 秒程度で完了します(順次実行なら 6 秒)。

通常の関数との違い

同期関数(def)

呼び出すと即座に実行される。戻り値は通常の値。

非同期関数(async def)

呼び出すとコルーチンオブジェクトを返す。await で実行される。

async def async_func():
    return 42

coro = async_func()  # コルーチンオブジェクト
print(type(coro))    # <class 'coroutine'>

注意点

await は async 関数の中でしか使えない
CPU バウンドな処理には向かない
asyncio.run() がイベントループを管理する

非同期関数は、ネットワーク通信やファイル I/O など待ち時間のある処理を効率的に扱えます。