簡単な例:2つの無関係なHTTPリクエストを並行して作成する必要があります。それを行う最も簡単な方法は何ですか?私はそれがそのようなことを期待:Pythonのコルーチンの並列非同期IO
async def do_the_job():
with aiohttp.ClientSession() as session:
coro_1 = session.get('http://httpbin.org/get')
coro_2 = session.get('http://httpbin.org/ip')
return combine_responses(await coro_1, await coro_2)
言い換えれば、私はIO操作を開始し、それらが効果的に並列に実行するように、その結果を待ちたいです。これはasyncio.gather
で達成することができます:
async def do_the_job():
with aiohttp.ClientSession() as session:
coro_1 = session.get('http://example.com/get')
coro_2 = session.get('http://example.org/tp')
return combine_responses(*(await asyncio.gather(coro_1, coro_2)))
次に、私はいくつかの複雑な依存構造を持つようにしたいですか?私はそれらのためのすべての前提条件を持っているときに操作を開始し、結果が必要なときに結果を得たいと思う。ここでは別途イベントループによって管理されているコルーチンとは別のタスクを作るasyncio.ensure_future
を支援します。
async def do_the_job():
with aiohttp.ClientSession() as session:
fut_1 = asyncio.ensure_future(session.get('http://httpbin.org/ip'))
coro_2 = session.get('http://httpbin.org/get')
coro_3 = session.post('http://httpbin.org/post', data=(await coro_2)
coro_3_result = await coro_3
return combine_responses(await fut_1, coro_3_result)
は、私はasyncio.ensure_future
かのいずれかを使用する必要があり、それ本当、私の論理フローでコルーチンと並列のノンブロッキングIOを達成するために、ということですasyncio.gather
(実際にはasyncio.ensure_future
を使用しています)?あまり「冗長」な方法はありますか?
通常の開発者は、コルーチンを個別のタスクにする必要があり、最適なパフォーマンスを得るためには前述の機能を使用する必要があります。
イベントループで複数のタスクを実行しないでコルーチンを使用することはありますか?
実際のイベントループタスクはどれくらい重いものですか?確かに、彼らはOSのスレッドやプロセスよりも「軽い」。このような仕事の可能な限り少ない数を私はどの程度まで努力すべきですか?
これは主に私の質問に回答しています。 'asyncio.gather'とコルーチン関数を使った連鎖や' asyncio.ensure_future'は、コルーチンと並行してIOを行う標準的な方法です。私のサンプルコードでは、誤ってaiohttpを使用していることが分かりました。 –