如何处理错误引发-Python3中的Asyncio

时间:2019-01-03 12:41:54

标签: python python-asyncio

我有一个函数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提供的,那似乎很难看。

预先感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

  

问题在于有时f()会引发Exception,但我不确定如何处理。

这取决于发生异常时要执行的操作。请记住,asyncio.gather()是便捷的API,默认情况下会传播异常,以避免在发生错误时盲目继续。如果您想要在出现异常情况下继续操作,则还有其他选择:

  • return_exceptions=True传递给gather-这将导致gather返回异常对象以及其他结果。方便且易于使用,但是将异常与常规结果混合在一起,这有点混乱。

  • 使用asyncio.wait()代替asyncio.gather()。它返回一组未来,您可以通过提高或产生结果来测试它们是否完成。

  • f()包装在您自己的函数中,该函数会在您认为合适的情况下捕获异常。您考虑并拒绝了此方法,但是在某些情况下,这是正确的方法。