Pythonのコルーチン非同期IO(II):asyncioコルーチンを達成するためのさまざまな方法を使用

はじめに:最後の章では、非同期からの収量へのソースから使用を導入し、最終的に私たちは見てみましょう、のは、コルーチン異なる制御構造を実装してみましょう、コルーチンの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

 

おすすめ

転載: www.cnblogs.com/liugp/p/11074586.html