【问题标题】:Debug and list all coroutine pending by future in python asyncio在 python asyncio 中调试并列出所有待处理的协程
【发布时间】:2017-08-02 04:22:39
【问题描述】:

我有一个生产代码大量使用了 asyncio.semaphore 模块,该模块被怀疑存在死锁问题。 我已经找到了一些解决方案,如何使用 unix 信号附加到正在运行的 python 代码,使用ipdb.set_trace() 进行调试,并使用asyncio.Task.all_tasks() 列出事件循环中的所有任务。我可以进一步检查每个任务的堆栈帧或查看ipdb 上的期货当前待处理的每一行协程吗?

【问题讨论】:

  • 每个任务都有方法Task.get_stack()。也许这就是你要找的。​​span>
  • @Qeek 感谢您的想法。 [*map(asyncio.Task.print_stack, asyncio.Task.all_tasks())] 工作正常。
  • 仅供参考。在 python 3.7 中,您可以使用 asyncio.all_tasks() 而不是 asyncio.Task.all_tasks() asyncio.Task.all_tasks() 已弃用,将在 python 3.9 中删除

标签: python-3.x debugging semaphore python-asyncio ipdb


【解决方案1】:

正如 OP 所观察到的,可以通过以下方式进行进一步检查

[*map(asyncio.Task.print_stack, asyncio.Task.all_tasks())]

(OP 当然可以免费self-answer。)

【讨论】:

  • 我有很多任务,都是由相同的代码创建的,但数据不同。我想看看当我的应用退出时哪个是坏的仍在运行;堆栈对我不是很有帮助。有没有办法给一个任务起一个名字,这个名字会被 str(task) 或 repr(task) 打印出来?
  • 好吧,如果你定义一个继承自 Task 的类,那么你当然可以添加一个属性并覆盖 repr 以便它显示该属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2020-10-10
  • 2019-09-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多