Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何判断哪个异步任务没有执行';不完整?_Python 3.x_Async Await_Python Asyncio - Fatal编程技术网

Python 3.x 如何判断哪个异步任务没有执行';不完整?

Python 3.x 如何判断哪个异步任务没有执行';不完整?,python-3.x,async-await,python-asyncio,Python 3.x,Async Await,Python Asyncio,我正在Python3.6中创建和运行一系列异步任务。我发现错误任务已被销毁,但它已挂起由于无法清理某些内容而退出应用程序时出错。我想调试一下 Asyncio很好地告诉我哪个源代码行创建了仍然挂起的任务,但这对我没有帮助,因为我的所有任务都是在同一点创建的。我如何判断哪个任务是延迟的?我可以清楚地命名任务(添加一个name属性并在repr()中使用它),但是从asyncio得到的错误没有在任务上调用repr()。 或者,如何捕获“任务已销毁”异常,或在pdb中停止?当某些任务甚至没有机会开始运行时

我正在Python3.6中创建和运行一系列异步任务。我发现
错误任务已被销毁,但它已挂起由于无法清理某些内容而退出应用程序时出错。我想调试一下

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

当某些任务甚至没有机会开始运行时,“任务已销毁但它处于挂起状态”消息可能表示事件循环已停止,如所述

消息由事件循环打印,因此您可以通过向以下对象注册自己的处理程序来调试它:


“Task destroyed but it pending”(任务已销毁,但它处于挂起状态)可能表示事件循环已停止,而某些任务甚至还没有机会开始运行,请参阅更多详细信息。要调试它,您可以在停止事件循环(或在关闭事件循环或在程序退出时)的点上迭代
Task.all_tasks()
,并使用自定义属性来区分挂起的事件。是的,确实是这样;任务仍在运行时,事件循环正在停止。但我不是那个阻止事件循环的人;这发生在我的测试装置的某个地方。不过,你检查
任务的想法可能会对我有所帮助;我将尝试在一些可能的地方插入它。我希望这个错误只是打印实际的任务!现在我注意到您实际上可以调用
loop.set\u exception\u handler
来设置自己的处理程序。使用包含任务对象和消息的dict调用它。您可以打印任务,停在
pdb
,等等。啊哈,太好了,@user4815162342!如果你把它变成一个答案,我会选择它作为正确答案。
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()