对于使用PyQt5在Python 3.4中构建的应用程序(并且使用asyncio和quamash,我有一个奇怪的效果,如果这很重要)。该程序执行一些周期性的操作,一次使用单独的线程time.sleep()
,一次使用asyncio协程和asyncio.sleep()
。现在,只要启动这些周期性操作中的一个或两个,应用程序的内存消耗就会稳定增加。使用objgraph模块和一些调试,我发现有很多QTimer
个对象生成并添加到主QApplication
对象(如果objgraph.show_backrefs()
是from PyQt5.QtCore import *
app = QCoreApplication.instance()
len(app.children())
Out[3]: 7627
len(app.children())
Out[4]: 8127
app.children()[0:10]
Out[5]:
[<PyQt5.QtCore.QAbstractEventDispatcher at 0x6155670>,
<PyQt5.QtGui.QSessionManager at 0x61556c0>,
<PyQt5.QtWidgets.QCommonStyle at 0x6155760>,
<PyQt5.QtCore.QTimer at 0x53a35d0>,
<PyQt5.QtCore.QTimer at 0x53a3580>,
<PyQt5.QtCore.QTimer at 0x53a36c0>,
<PyQt5.QtCore.QObject at 0x61557b0>,
<PyQt5.QtCore.QTimer at 0x53bbd50>,
<PyQt5.QtCore.QTimer at 0x53bbda0>,
<PyQt5.QtCore.QTimer at 0x6a81080>]
,则不会被其他任何对象引用对)。我可以在直接检查QApplication对象的子项时看到这一点:
for t in filter(lambda o: isinstance(o, QTimer), app.children()):
t.setParent(None)
这非常有趣(而且很烦人),特别是考虑到我自己不创建任何单个QTimer对象时。 Qt使用的那些计时器是什么?当我手动删除所有QTimer对象时
require.js
然后没有释放内存,但消耗不会进一步增加。该应用程序似乎仍然正常工作。在打开和关闭一些窗口之后,恢复原始行为,即生成新的定时器并且增加存储器消耗。在哪里/如何进行更多调试以找到原因?
非常欢迎任何提示!
此致 菲利普