如何判断哪个异步任务没有完成?

时间:2018-07-31 17:40:10

标签: python-3.x async-await python-asyncio

我正在python 3.6中创建并运行一堆异步任务。我的应用退出时出现ERROR Task was destroyed but it is pending!错误,因为我无法清理某些内容。我想调试一下。

Asyncio很好地告诉了我,哪个源代码行创建了仍悬而未决的任务,但这无济于事,因为我的所有任务都是在同一时间创建的。我怎么知道是延迟的任务?我可以清楚地命名任务(添加名称属性并在repr()中使用它),但是从asyncio中收到的错误不会在任务上调用repr()。 或者,如何捕获“任务销毁”异常,或在那里停止pdb?

1 个答案:

答案 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()