【发布时间】:2012-08-03 20:58:03
【问题描述】:
我有一个挂起的 PyQt 应用程序。
Qt 4.7.4(64 位) Python 2.6.1 GCC 4.2.1 OSX 10.6.8
挂起的位置各不相同。如果我禁用/重写一个挂起位置,则挂起不久就会发生在其他地方。
应用程序执行的搜索可能会返回数千个自定义数据对象,每个对象可能包含五十个子对象。
日志显示挂起往往发生在创建这些自定义对象的循环中。
也
应用程序使用线程,但是即使我禁用这些线程也会发生挂起。 (我正在使用Laszlo Nagy's stack trace tool 来验证这一点。即使只有主线程和堆栈跟踪线程正在运行,也会发生挂起。)
应用程序读取并创建图像文件。 I/O 锁似乎不太可能是罪魁祸首,但我还没有排除它。
我想知道
我可以创建的 python 对象的数量有限制吗?
我可能会达到其他限制吗?
我没有为垃圾收集做任何明确的对象删除。我应该吗?
还有其他常见的嫌疑人吗?
编辑(8/13):
QTimer.singleShot 很值得了解并且是热门线索 - 但是此应用不使用 singleShot。
当应用程序挂起时,它会占用 100% 的 CPU(以及大约 140 MB 的内存。)
我会尽快尝试 strace 看看它会显示什么。
【问题讨论】:
-
尝试使用
strace运行您的程序,它会显示您的程序进行的系统调用。这应该使您能够在阻塞系统调用发生时看到挂起。 -
这些搜索和它们返回的数据对象是否可以与界面分离?如果不是,他们应该是。这不会解决问题,但会使调试更容易。
-
当应用程序“挂起”时,您的内存/cpu 使用情况如何?
-
我能想到一个“常见的嫌疑人”:在多线程环境中过度使用 QTimer.singleShot(即使第二个线程与计时器没有交互)。
-
这不容易做到,但它是一种有效的调试技术:尝试将程序缩减为最短、最简单的可运行示例,但仍能证明问题。要么你最终会得到一些你可以发布的东西,我们都可以看看,和/或你会发现问题的性质和根源。
标签: python multithreading pyqt freeze