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 など待ち時間のある処理を効率的に扱えます。