【发布时间】:2013-06-03 21:15:42
【问题描述】:
我目前正在编写一个相当复杂的多线程 Python 脚本。有一个主要功能一次在大约 5 个线程中运行。我一直遇到一些问题,它挂起并使用它运行的 100% 的处理器内核。这种挂起发生在 main 函数运行了数百次之后,因此很难准确地确定它发生的时间或地点。一旦程序挂起,它就再也不会开始运行了。
似乎每次只有一个线程挂起,所以我不太明白为什么它会挂起整个程序。那时我发现this Stack Overflow solution 解释说:“在某些 Python 实现中,一次只能执行一个 Python 线程。CPython 中的线程仅对多路复用 IO 操作真正有用,而不是用于将 CPU 密集型任务置于后台。”因此,当一个线程因 CPU 使用率满而挂起时,整个程序就会停止,这是可以理解的。
下面是进程资源管理器在程序挂起时查看 python.exe 进程的屏幕截图。如您所见,实际上只有一个线程在做某事。
我希望能够准确分析在脚本挂起之前执行了哪些行。我真的不知道我可以在哪里使用“import pdb; pdb.set_trace()”插入断点,因为我不知道它何时何地会搞砸。我无法手动单步执行该程序,因为它需要运行 30 分钟到几个小时才能挂起。我尝试查看我的脚本以查找任何可能导致的明显无限循环或类似情况,但我似乎无法弄清楚导致挂起的原因。
我的问题是:我将如何调试它?理想情况下,我只想看看在挂起之前执行了哪些行,但我什至不知道如何检测它何时挂起。我不能在这里发布完整的脚本,所以希望有人知道我可以如何调试它。提前致谢。
【问题讨论】:
-
一个建议是 Python 中的线程只能在原子操作上阻塞整个程序,例如,如果您正在对非常大的列表进行排序。
-
使用跟踪模块。
-
您是否尝试过发送
KeyboardInterrupt并查看回溯的来源? -
@Marcin 这看起来很有趣。我会试试看它是否有帮助。谢谢!
标签: python multithreading debugging