【发布时间】:2018-06-21 18:03:43
【问题描述】:
我的 Tornado 处理程序中有以下方法:
async def get(self):
url = 'url here'
try:
async for batch in downloader.fetch(url):
self.write(batch)
await self.flush()
except Exception as e:
logger.warning(e)
这是 downloader.fetch() 的代码:
async def fetch(url, **kwargs):
timeout = kwargs.get('timeout', aiohttp.ClientTimeout(total=12))
response_validator = kwargs.get('response_validator', json_response_validator)
extractor = kwargs.get('extractor', json_extractor)
try:
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url) as resp:
response_validator(resp)
async for batch in extractor(resp):
yield batch
except aiohttp.client_exceptions.ClientConnectorError:
logger.warning("bad request")
raise
except asyncio.TimeoutError:
logger.warning("server timeout")
raise
我想从多个下载器并行生成“批处理”对象。 我想要第一个下载器的第一个可用批次,依此类推,直到所有下载器完成。像这样的东西(这不是工作代码):
async for batch in [downloader.fetch(url1), downloader.fetch(url2)]:
....
这可能吗?我如何修改我正在做的事情以便能够从多个协同程序中并行产生?
【问题讨论】:
-
我问过类似的question,虽然问题本身不同,但我的代码展示了并行 IO(通过
aiofiles模块)
标签: python asynchronous async-await python-asyncio