【发布时间】:2022-11-17 20:23:03
【问题描述】:
我有一个依赖一些第三方库的大项目,有时它的执行会被 CancelledError 中断。
为了演示这个问题,让我们看一个小例子:
import asyncio
async def main():
task = asyncio.create_task(foo())
# Cancel the task in 1 second.
loop = asyncio.get_event_loop()
loop.call_later(1.0, lambda: task.cancel())
await task
async def foo():
await asyncio.sleep(999)
if __name__ == '__main__':
asyncio.run(main())
追溯:
Traceback (most recent call last):
File "/Users/ss/Library/Application Support/JetBrains/PyCharm2021.2/scratches/async.py", line 19, in <module>
asyncio.run(main())
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
return loop.run_until_complete(main)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 579, in run_until_complete
return future.result()
concurrent.futures._base.CancelledError
如您所见,没有关于 CancelledError 起源位置的信息。我如何找出它的确切原因?
我想出的一种方法是放置大量 try/except 块,这些块将捕获 CancelledError 并缩小它的来源范围。但这很乏味。
【问题讨论】:
-
这不是我的完整回溯。
During handling of the above exception, another exception occurred:及之前的部分为还追溯的一部分。 -
@MisterMiyagi,这实际上是我看到的所有回溯。使用 python 3.7 测试。你能发布你看到的回溯吗?
-
It's rather a bit longer。虽然它是用 Python 3.9 记录的,chaining exists since 3.0。
-
@MisterMiyagi,谢谢。据我了解,您的回溯准确显示了取消的来源。可惜 python 3.7 没有这样做。
-
看起来这确实只适用于 3.9; 3.8 也删除了链。不过,我在变更日志中没有找到任何内容。
标签: python python-asyncio