我正在python 3.6中创建并运行一堆异步任务。我的应用退出时出现ERROR Task was destroyed but it is pending!
错误,因为我无法清理某些内容。我想调试一下。
Asyncio很好地告诉了我,哪个源代码行创建了仍悬而未决的任务,但这无济于事,因为我的所有任务都是在同一时间创建的。我怎么知道是延迟的任务?我可以清楚地命名任务(添加名称属性并在repr()中使用它),但是从asyncio中收到的错误不会在任务上调用repr()。 或者,如何捕获“任务销毁”异常,或在那里停止pdb?
答案 0 :(得分:1)
“任务已销毁但未决”消息可能表明事件循环正在停止,而某些任务甚至没有机会开始运行,例如here。
该消息是由事件循环打印的,因此您可以通过向set_exception_handler
注册自己的处理程序来对其进行调试:
import asyncio
def report(loop, context):
if 'task' in context:
task = context['task']
print(context['message'])
import pdb; pdb.set_trace()
async def dummy():
pass
def test():
loop = asyncio.get_event_loop()
loop.set_exception_handler(report)
loop.call_soon(loop.create_task, dummy())
loop.call_soon(loop.stop)
loop.run_forever()
loop.close()
test()