私はaiohttp
を使ってたくさんのリクエストを出します。各リクエストが完了するとすぐに結果を1つずつ取得する方法はありますか?準備ができたらすぐにasyncioコルーチン/タスクを反復する
おそらくasync for
のようなものを使用していますか?またはPython 3.6非同期ジェネレータ?
現在、私はawait asyncio.gather(*requests)
であり、すべてが完了した時点で処理します。
私はaiohttp
を使ってたくさんのリクエストを出します。各リクエストが完了するとすぐに結果を1つずつ取得する方法はありますか?準備ができたらすぐにasyncioコルーチン/タスクを反復する
おそらくasync for
のようなものを使用していますか?またはPython 3.6非同期ジェネレータ?
現在、私はawait asyncio.gather(*requests)
であり、すべてが完了した時点で処理します。
私はドキュメントに従って、requests
はFuture
です(またはasyncio.ensure_futureを使用して簡単に将来に変換することができます)。
Future
オブジェクトのメソッドは.add_done_callback
です。 したがって、リクエストごとにコールバックを追加してから、gather
を実行することができます。
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
Canonicalの方法はcrawler exampleのようasyncio.Queue
に結果を推進しています。 また、数百万の新しいタスクを生成する代わりに、入力キューから新しいジョブを取得するダウンロードタスクに限られた量を実行することが賢明です。
非常に低いレベルのものを書くまでは、 'add_done_callback'を使わないでください。 –