代码之家  ›  专栏  ›  技术社区  ›  GaryO

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

  •  1
  • GaryO  · 技术社区  · 7 年前

    我正在用Python3.6创建和运行一系列异步任务。我得到 ERROR Task was destroyed but it is pending! 应用程序退出时出错,因为我无法清除某些内容。我想调试一下。

    Asyncio很好地告诉我哪个源代码行创建了仍然挂起的任务,但这对我没有帮助,因为我的所有任务都是在同一点上创建的。我怎样才能知道哪个任务是延迟的?我可以清楚地命名任务(添加一个name属性并在repr()中使用它),但是从asyncio得到的错误不会对任务调用repr()。 或者,如何捕获“任务已销毁”异常,或者在PDB中停止?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user4815162342    7 年前

    “任务已销毁但仍处于挂起状态”消息可能指示事件循环已停止,而某些任务甚至没有机会开始运行,如所述 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()