python asyncio 中的 "Executing <Handle <TaskWakeupMethWrapper..." 警告是什么意思

What does an "Executing <Handle <TaskWakeupMethWrapper..." warning in python asyncio mean

设置异步未来的结果时正在打印以下消息。

Executing <Handle <TaskWakeupMethWrapper object at 0x7fc3435141f8>(<Future finis...ection.py:260>) created at /media/stuff/stuff/projects/dare/dcds/dcds/common/connection.py:221> took 1.723 seconds

我什至不知道从哪里开始寻找原因。但是,如果我关闭 asyncio 调试模式,它就会崩溃并向我显示这个。

Task was destroyed but it is pending!
task: <Task pending coro=<upload.<locals>.upload_coro() done, defined at /media/stuff/stuff/projects/dare/dcds/dcds/__main__.py:58> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fdf5df01d38>()]> cb=[_chain_future.<locals>._call_set_state() at /home/elviento/anaconda3/lib/python3.6/asyncio/futures.py:414]>
Executing <Handle <TaskWakeupMethWrapper object at 0x7fc3435141f8>(<Future finis...ection.py:260>) created at /media/stuff/stuff/projects/dare/dcds/dcds/common/connection.py:221> took 1.723 seconds

这个警告的主要部分是took 1.723 seconds:警告说某些协程(或任务)冻结了你的事件循环 1.7 秒,这是不正常的情况(如果你不明白为什么,请阅读答案 or better ).

如您所述,只有在调试模式打开时,asyncio 才会跟踪此问题。

Task was destroyed but it is pending!

无论调试模式如何,您都会收到此警告,这意味着在您调用 loop.close() 的那一刻,您仍然有 运行 个任务。这又是不正常的情况(阅读 了解原因)。


如果没有可重现的代码片段,很难说更多。

如果您将任务存储在 WeakValueDictionary 中,它可能会出现问题,是的。在关闭事件循环之前,您应该 所有任务(或等待它们完成)。

在 Python 的最新版本*中,您将获得更多有关哪个任务持有事件循环时间过长的信息。该功能在此处进行了更多讨论:https://bugs.python.org/issue38986

* Python 3.7.6 或 Python 3.8.1