asyncio.gather的文档说
如果 return_exceptions 为 False(默认值),则第一个引发的异常会立即传播到在 gather() 上等待的任务。aws 序列中的其他等待对象不会被取消,并将继续运行。
async def fetch(url):
async with aiohttp.ClientSession() as s:
async with s.get(url) as resp:
resp.raise_for_status()
return await resp.text()
urls = ["https://google.com", "https://google.com/non-existent"]
try:
results = await asyncio.gather(*[asyncio.create_task(fetch(url)) for url in urls])
except Exception as e:
print(e)
我运行上面的代码没有任何东西绑定到results
变量,因为其中一项任务引发了异常。我不明白该文档,它说如果return_exceptions=True
,则异常被收集,如果是False
,则第一个引发的异常被传播到任务,其他等待对象继续运行。我希望引发 excpetion 的任务不会出现在 collect 中results
,但是NameError
当我尝试获得成功任务的结果时,我得到了。