最終更新:2021-08-13 (金) 20:43:30 (948d)
Python/asyncio
async/await構文を使い、並行処理(concurrent)のコードを書くためのライブラリ
https://docs.python.org/ja/3/library/asyncio.html
Python 3.4で追加
asyncio は次の目的で 高レベル API を提供しています:
並行にコルーチンを起動 し、実行全体を管理する
ネットワークIO?とIPCを執り行う
subprocesses?を管理する
キューを使ってタスクを分散する
- asyncio.Queue?
並列処理のコードを同期させる
歴史
Python 3.7
- https://docs.python.org/ja/3/whatsnew/3.7.html#whatsnew37-asyncio
- asyncio.create_taskが追加
- asyncio.run
Python 3.5
Python 3.4
- asyncioが標準モジュールに
Python/async
- await式を含んでいなくても、関数をコルーチンとして振舞うようにするキーワード
async def
- 単なる関数定義ではなくPython/コルーチン関数定義
- 実行するとPython/コルーチンオブジェクト?が返る。
- Python/コルーチンオブジェクト?はPython/イベントループ内でのみ実行が可能
Python/await
- コルーチンが実行を返すのを待ち,実行が終わるまで制御を解放してイベントループに渡す
Python/awaitableオブジェクト
- await 文に指定できるオブジェクト
- awaitable オブジェクトには主に3つの種類があります:
Python/コルーチン
- loop.run_until_complete()にはコルーチンを渡すこともできます。
- そのとき、コルーチンは内部でensure_future?()によってTaskオブジェクト化されます。
Python/Task
Python/Future
使い方
Python/await {future}
- その時点で一旦停止し、完了したら続きを実行
Python/await {coroutine}
- コルーチンの完了を待機
メモ
- await文が未完了なFutureを受け取ると、そのコルーチンをブロックし、別の実行可能なコルーチンを実行します。
- 途中でFutureのステータスが完了に移行すると、ブロックが解除され コルーチンが再開します。
Python/イベントループ
メソッド
asyncio.get_event_loop
- run_until_complete
- run_forever
asyncio.run
- asyncio.run(coro, *, debug=False)
- コルーチン coro を実行し、結果を返します。
- Python 3.7で追加
asyncio.sleep
asyncio.gather
- awaitable オブジェクト を 並行実行?
- awaitable がコルーチンである場合、自動的に Task としてスケジュール
asyncio.create_task
- コルーチンをTask でラップし、その実行をスケジュール