代码之家  ›  专栏  ›  技术社区  ›  MeanStreet

如何处理python3中的错误raise-asyncio

  •  1
  • MeanStreet  · 技术社区  · 5 年前

    我有个功能 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 可以包含一个 例外 ,但这里不是这样,错误会出现,程序崩溃。

    我怎样才能做到?我想我可以为 F-() try: catch: 例外,但如果该特性是由lib提供的,则看起来很难看。

    提前感谢您的帮助,

    1 回复  |  直到 5 年前
        1
  •  1
  •   user4815162342    5 年前

    问题是有时 f() 提出一个 Exception 我不知道怎么处理。

    这将取决于发生异常时要做什么。记住 asyncio.gather() 是一个方便的API,它在默认情况下传播异常,以避免在出现错误时盲目地继续。如果你 希望 要在异常情况下继续,您还有其他选项:

    • 通过 return_exceptions=True gather -这将导致 聚集 返回异常对象和其他结果。方便且易于使用,但将异常与常规结果混合在一起,这有点混乱。

    • 使用 asyncio.wait() 而不是 异步收集() . 它返回一组 期货 ,您可以测试它们是通过提升还是通过生成结果来完成。

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