2017-06-09 8 views
1

私はaiohttpを使ってたくさんのリクエストを出します。各リクエストが完了するとすぐに結果を1つずつ取得する方法はありますか?準備ができたらすぐにasyncioコルーチン/タスクを反復する

おそらくasync forのようなものを使用していますか?またはPython 3.6非同期ジェネレータ?

現在、私はawait asyncio.gather(*requests)であり、すべてが完了した時点で処理します。

答えて

0

私はドキュメントに従って、requestsFutureです(またはasyncio.ensure_futureを使用して簡単に将来に変換することができます)。

Futureオブジェクトのメソッドは.add_done_callbackです。 したがって、リクエストごとにコールバックを追加してから、gatherを実行することができます。

Docs for Future.add_done_callback

+2

非常に低いレベルのものを書くまでは、 'add_done_callback'を使わないでください。 –

1

asyncioおそらく何が必要ありませんas_completed機能を持っています。これは、非同期ではなく、通常のイテレータを返します。ここで

は使い方の例です:

import asyncio 


async def test(i): 
    await asyncio.sleep(i) 
    return i 


async def main(): 
    fs = [ 
     test(1), 
     test(2), 
     test(3), 
    ] 

    for f in asyncio.as_completed(fs): 
     i = await f # Await for next result. 
     print(i, 'done') 



loop = asyncio.new_event_loop() 
asyncio.set_event_loop(loop) 
try: 
    loop.run_until_complete(main()) 
finally: 
    loop.run_until_complete(loop.shutdown_asyncgens()) 
    loop.close() 

出力:

1 done 
2 done 
3 done 
1

Canonicalの方法はcrawler exampleのようasyncio.Queueに結果を推進しています。 また、数百万の新しいタスクを生成する代わりに、入力キューから新しいジョブを取得するダウンロードタスクに限られた量を実行することが賢明です。

関連する問題