我有个功能 f() 这就调用了一个API,我想异步地多次调用它。我用 asyncio 像这样:
f()
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-()
Exception
Futures
例外
我怎样才能做到?我想我可以为 F-() 和 try: catch: 例外,但如果该特性是由lib提供的,则看起来很难看。
try: catch:
提前感谢您的帮助,
问题是有时 f() 提出一个 Exception 我不知道怎么处理。
这将取决于发生异常时要做什么。记住 asyncio.gather() 是一个方便的API,它在默认情况下传播异常,以避免在出现错误时盲目地继续。如果你 希望 要在异常情况下继续,您还有其他选项:
asyncio.gather()
通过 return_exceptions=True 到 gather -这将导致 聚集 返回异常对象和其他结果。方便且易于使用,但将异常与常规结果混合在一起,这有点混乱。
return_exceptions=True
gather
聚集
使用 asyncio.wait() 而不是 异步收集() . 它返回一组 期货 ,您可以测试它们是通过提升还是通过生成结果来完成。
asyncio.wait()
异步收集()
包裹 F-() 在您自己的函数中捕获您认为合适的异常。您考虑过并拒绝了这一点,但在某些情况下,这正是正确的方法。