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

Mea*_*eet 6 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())
Run Code Online (Sandbox Code Playgroud)

问题是有时f()会引发一个问题Exception,我不知道如何处理它。文档说Futures可以包含一个Exception,但这里的情况并非如此,会引发错误并且程序崩溃。

我该如何实现这一目标?我想我可以为f()try: catch:Exception 编写一个包装器,但如果该功能是由库提供的,那看起来很丑陋。

预先感谢您的帮助,

use*_*342 11

问题是有时f()会引发一个问题Exception,我不知道如何处理它。

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

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

  • 使用asyncio.wait()而不是asyncio.gather(). 它返回一组future,您可以测试每个 future 是否通过提高或产生结果来完成。

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