最終更新:2021-08-13 (金) 20:43:30 (979d)  

Python/asyncio
Top / Python / asyncio

async/await構文を使い、並行処理(concurrent)のコードを書くためのライブラリ

https://docs.python.org/ja/3/library/asyncio.html

Python 3.4で追加

PEP 3156

asyncio は次の目的で 高レベル API を提供しています:

並行にコルーチンを起動 し、実行全体を管理する

  • この場合並列処理(parallel)はしていない。並行処理 (Concurrent)
  • awaitの行の処理を待ってる間に他の処理を実行

ネットワークIO?IPCを執り行う

subprocesses?を管理する

キューを使ってタスクを分散する

  • asyncio.Queue?

並列処理のコードを同期させる

歴史

Python 3.7

Python 3.5

Python 3.4

Python/async

  • await式を含んでいなくても、関数をコルーチンとして振舞うようにするキーワード

async def

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 でラップし、その実行をスケジュール

asyncio.to_thread?

asyncio.wait

Python/yield?

yield from

クラス

関連

参考