【发布时间】:2017-11-08 00:10:29
【问题描述】:
简单示例:我需要并行发出两个不相关的 HTTP 请求。最简单的方法是什么?我希望它是这样的:
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)
为了在我的逻辑流程中使用协程实现并行非阻塞 IO,我是否必须使用 asyncio.ensure_future 或 asyncio.gather(实际上使用 asyncio.ensure_future)?有没有更“冗长”的方式?
通常开发人员必须考虑哪些协程应该成为单独的任务并使用上述功能以获得最佳性能,这是真的吗?
在事件循环中使用没有多个任务的协程有什么意义吗?
事件循环任务在现实生活中有多“重”?当然,它们比操作系统线程或进程“更轻”。我应该在多大程度上争取尽可能少的此类任务?
【问题讨论】:
标签: python python-asyncio aiohttp