asyncioでのコルーチンオブジェクトとFutureオブジェクトの使い方を詳しく解説

高洛峰
リリース: 2017-03-28 15:28:17
オリジナル
2876 人が閲覧しました

asyncio は、Python バージョン 3.4 で導入された標準ライブラリであり、非同期 IO のサポートが組み込まれています。 asyncio のプログラミングモデルはメッセージループです。今日は、asyncio におけるコルーチンと Future オブジェクトの関係について詳しく説明します

実際、コルーチンは、外部からパラメーターを受け取り、結果を生成できる

ジェネレーター

関数

です。関数を一時停止し、後で実行を再開することができます。一時停止期間中は、他のタスクに切り替えて実行を継続できます。 Javascript は、値が将来計算されるプレースホルダーです。上記の例では、ネットワーク IO 関数が完了するのを待っている間に、関数によってコンテナーが提供され、完了すると Promise がコンテナーに入力されます。

コールバック関数

を使用して実際の結果を取得できます。

TaskオブジェクトはコルーチンとFutureを接続し、コルーチンをFutureオブジェクトにカプセル化するものです。通常、2種類のものが表示されます。メソッド、

tasks = [
  asyncio.ensure_future(func1()),
  asyncio.ensure_future(func2())
  ]
loop.run_until_complete(asyncio.wait(tasks))
ログイン後にコピー
ensure_futureはコルーチンをタスクにカプセル化できます。asyncio.gatherはいくつかのFutureとコルーチンをFutureにカプセル化します。

run_until_completeは両方のFutureオブジェクトを受け取ることができます。コルーチン オブジェクト、

Task にすることができます。 正しい終了方法

asyncio タスク ループで、CTRL-C を使用して終了すると、例外がキャッチされた場合でも、イベント ループ内のタスクは終了します。エラーを報告すると、次のエラーが発生します。

タスクは破棄されましたが、保留中です!

タスク: <タスク保留中 coro=for

; =>

公式ドキュメントによると、Task オブジェクトは次の状況でのみ終了したとみなされます。

結果/例外が利用可能です。または、Future がキャンセルされたということです

Task オブジェクトのキャンセルとその他のタスクの親クラス Future は少し異なります。 Task.cancel() が呼び出されると、対応するコルーチンは

event ループの次のラウンドで CancelledError 例外をスローします。 Future.cancelled() を使用すると、すぐには True が返されません (タスクの終了を示すために使用されます)。上記の例外が処理され、タスクが終了した後でのみキャンセルされたとみなされます。

そのため、タスクを終了するには、

for task in asyncio.Task.all_tasks():
  task.cancel()
ログイン後にコピー
を使用してすべてのタスクを検索し、キャンセルすることができます。


ただし、CTRL-C はイベント ループを停止するので、イベント ループを再起動する必要があります。

よくわからない場合は、

asyncio.gather を使用できます。 (..., return_Exceptions=True)

例外を通常の結果の戻り値に変換します。

以上がasyncioでのコルーチンオブジェクトとFutureオブジェクトの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート