はじめに:最後の章では、非同期からの収量へのソースから使用を導入し、最終的に私たちは見てみましょう、のは、コルーチン異なる制御構造を実装してみましょう、コルーチンのasyncio.wait()メソッドを実装しますそれらの異なる役割を見て〜
コルーチン複数のリニア制御フローやすいビルトインてキーワードがawait
管理します。使用asyncio
モジュールのメソッドは、より複雑な構造を実現することができ、それができ、同時に複数のコルーチンを完了しました。
一、asyncio.wait()
あなたは1つの複数の部分に操作して、別々に行うことができる、とwait(tasks)
するために使用することができ、割り込みタスクのコレクション(タスク)のいずれかのポーリングイベントループを前に完了するコルーチン他のバックグラウンド処理まで、タスクに目覚めされています。
インポート時 のインポートASYNCIO 非同期DEF taskIO_1(): 印刷(「実行を開始... IOタスク1 」) のawaitのasyncio.sleep( 2) #は、その時間のかかる作業2Sと仮定すると、 印刷(「IOタスク1が完了した、時間のかかる2S 」) を返す taskIO_1を。__NAME__ 非同期DEF taskIO_2を(): 印刷(' 実行を開始... IOタスク2 ' ) のawaitのasyncio.sleep( 3) #時間のかかるタスク3Sのと仮定すると、 印刷は、(" IOタスク2は、時間のかかる3Sを完了しました") に戻る。taskIO_2 __name__ 非同期DEFのメイン(): #の呼び出し元 タスク= [taskIO_1()、taskIO_2は()] #タスクにすべてのタスクを追加 DONE、のawait asyncio.wait =保留(手順)#の子プロデューサの ための R&LT で DONE: #はDONEとタスクが保留されて、返された結果は、個別に()の結果を呼び出す必要があります 印刷(「:コルーチン障害の戻り値」 + r.result()) のIF __name__ == 「__main__ 」: スタート = 時間.time() ループ = asyncio.get_event_loop()#ループにオブジェクトのイベントループを作成して 試してみる: loop.run_until_complete(メイン()) #のミッションの最後の最後までイベントループの完了 最後に: loop.close()#のイベントループの最後に 印刷(「すべてのIOタスク総時間%.5fをS "%フロート(time.time() -スタート))
次のように実行結果は以下のとおりです。
1 ... IOタスクが実行を開始
IOタスク2走行開始を...
IOタスク1が完了した、時間のかかる2S
IOタスク2が完了した、時間のかかる3Sは、
無秩序な戻り値をコルーチン:taskIO_2は
taskIO_1:無秩序な戻り値をコルーチン
すべてのIOタスク総時間3.00209秒
[説明]:待って()公式ドキュメントを使用し、次のように:
行われ、保留中の=はasyncio.wait(AWS)を待ちます
ここで、同時に着信実行AWSによってながら、(awaitableオブジェクト)のawait(ペンディング、行わ)を含むタプルを返すのDONE表すタスクのリストが完了した、保留中表すタスクのリストは完全ではありません。
注意:
①時にのみにするまで待機() 、着信タイムアウトのみ可能なパラメータ保留リスト。
②スルー待ち()を返し、結果セットがあるに応じてイベントループタスク完了順序しばしばように、配置された異なるタスクの元の順序。
二、asyncio.gather()
あなたが唯一のコルーチンの結果を懸念している並行コレクションを実行する場合は、使用することができますgather()
によってだけでなく、それをawait
返しますのみ1つの結果セット、および結果セットの結果の順序が入ってくるの課題である元の順序。
インポート時 のインポートASYNCIO 非同期DEF taskIO_1(): 印刷(「実行を開始... IOタスク1 」) のawaitのasyncio.sleep( 3) #は、その時間のかかる作業3Sと仮定すると、 印刷(「IOタスク1が完了した、時間のかかる3S 」) を返す taskIO_1を。__NAME__ 非同期DEF taskIO_2を(): 印刷(' 実行を開始... IOタスク2 ' ) のawaitのasyncio.sleep( 2) #時間のかかるタスクの2Sと仮定すると、 印刷は、(" IOタスク2は、時間のかかる2Sを完了しました") 戻り taskIO_2。__name__ 非同期DEFのメイン(): #の呼び出し側は のawaitのasyncio.gather =(taskIO_1(resualts)、taskIO_2())#の子プロデューサー 印刷(resualtsを) のIF __name__ == ' __main__ ' : スタート = time.timeを() ループ = asyncio.get_event_loop() #イベントループがループをオブジェクトの作成 を試して: loop.run_until_complete(メイン()) #のイベントループが完了したミッションの最後の最後まで、 最後に: loop.close() #のイベントループの最後に 印刷を(' 秒のすべてのIOタスクの合計時間は、%.5f '%フロート(time.time() -スタート))
次のように実行結果は以下のとおりです。
IOタスクが実行を開始する2つの... IOタスク1を実行開始... IOタスク2が完了した、時間のかかる2S IOタスク1が完了した、時間のかかる3S [ 「taskIO_1 」、「taskIO_2 」] すべてのIOタスク総時間3.00184第2
[説明]:gather()
を通じてawait
ダイレクトに戻り、結果セットリスト、我々は明らかに結果から見ることができるタスク2が最初に完了しているが、出てきたが、最終的に返される結果セットの注文が入ってくるための最初のタスクに基づいてランク付けされ。
三、asyncio.as_completed()
as_completed(tasks)
ある発電機、それが管理してコルーチンのリストを実行する(ここでは、着信タスクがあります)。タスク内のタスクセットリードが終了すると、それはによって初めてとなるawait
キーワードのタスクに復帰。目に見える順序と結果を返すwait()
に従っているようタスクの順序の。
インポート時 のインポートASYNCIO 非同期DEF taskIO_1(): 印刷(「実行を開始... IOタスク1 」) のawaitのasyncio.sleep( 3) #は、その時間のかかる作業3Sと仮定すると、 印刷(「IOタスク1が完了した、時間のかかる3S 」) を返す taskIO_1を。__NAME__ 非同期DEF taskIO_2を(): 印刷(' 実行を開始... IOタスク2 ' ) のawaitのasyncio.sleep( 2) #時間のかかるタスクの2Sと仮定すると、 印刷は、(" IOタスク2は、時間のかかる2Sを完了しました") 戻り taskIO_2。__name__ 非同期DEFのメイン(): #の呼び出し元 タスク= [taskIO_1()、taskIO_2()] #タスクにすべてのタスクを追加 するために completed_task 中)asyncio.as_completed(作業: resualt =のawaitのcompleted_taskの#生成ある 印刷(' :コルーチン障害の戻り値' + resualt) IFは __name__ == ' __main__ ' : スタートは = time.time() ループ = asyncio.get_event_loop() #をイベントループがループにオブジェクトを作成して 試してみる: loop.run_until_complete(メイン()) #のミッションの最後の最後までイベントループが完了したことを 最後に: loop.close() #のイベントループの最後に 印刷(" %.5f秒ですべてのIOタスクの合計時間を"%フロート(time.time() -スタート))
次のように実行結果は以下のとおりです。
IOタスクが実行を開始... 2つの
IOタスク1を実行開始は...
IOタスク2が完了した、時間のかかる2sが
無秩序戻り値をコルーチン:taskIO_2
IOタスク1が完了した、時間のかかる3Sは
taskIO_1:無秩序な戻り値をコルーチン
すべてのIOタスク総時間3.00300秒
[説明]:使用して上記の手順から分かるas_completed(タスク)、及び(タスク)を待つ共通のリターン結果順序がある完了コルーチンの順序、収集は、()だけ反対です。違いがあることをas_completed(タスク)ができるリアルタイムに戻る完成し、現在の結果、および(タスク)を待って、すべてのコルーチンの終了後に返すために待つ必要が行われた結果を取得します。
IVの概要
以下は、aws
意味します:awaitable objects
。つまり、オブジェクトのセットを待つことができるようなコルーチンは、コルーチン複数のオブジェクトを待っているような、リスト A aws
。
asyncio | 主なパラメータの受け渡し | 戻り値のシーケンス | await 戻り値の型 |
関数の戻り値の型 |
待つ() | AWS | コルーチン完全な配列 | (保留中、行われ) 2つのタプルとタスクリスト |
コルーチン |
as_completed() | AWS | コルーチン完全な配列 | 元の値を返します。 | イテレータ |
ギャザー() | * AWS | タスクの順序を渡すパラメータ | 値のリストを返します。 | awaitable |