我有一个函数f()
,它可以进行API调用,并且我想异步地多次调用它。我这样使用asyncio
库:
async def main():
loop = asyncio.get_event_loop()
futures = [loop.run_in_executor(None, f) for i in range(10)]
await asyncio.gather(*futures)
return futures
result = asyncio.get_event_loop().run_until_complete(main())
问题在于有时f()
会引发Exception
,但我不确定如何处理。该文档说Futures
可以包含一个Exception
,但事实并非如此,会引发错误并导致程序崩溃。
我该如何实现?我想我可以为f()
和try: catch:
异常编写一个包装器,但是如果该功能是由lib提供的,那似乎很难看。
预先感谢您的帮助,
答案 0 :(得分:1)
问题在于有时
f()
会引发Exception
,但我不确定如何处理。
这取决于发生异常时要执行的操作。请记住,asyncio.gather()
是便捷的API,默认情况下会传播异常,以避免在发生错误时盲目继续。如果您想要在出现异常情况下继续操作,则还有其他选择:
将return_exceptions=True
传递给gather
-这将导致gather
返回异常对象以及其他结果。方便且易于使用,但是将异常与常规结果混合在一起,这有点混乱。
使用asyncio.wait()
代替asyncio.gather()
。它返回一组未来,您可以通过提高或产生结果来测试它们是否完成。
将f()
包装在您自己的函数中,该函数会在您认为合适的情况下捕获异常。您考虑并拒绝了此方法,但是在某些情况下,这是正确的方法。