我正在使用 pyqt4 的 QThreads。我有一个一直在运行的线程,我们称之为主线程。在构造函数中, main 初始化一个空列表。我通过将子线程附加到列表中来从 main 生成子线程:
@QtCore.pyqtSlot(str)
def spawn(self):
download_t = DownloadWorker() #this subclasses QtCore.QThread
download_t.talker.connect(self.exec_js)
download_t.start()
self.items.append(download_t)
如果我不在此列表中存储引用,则线程会在执行离开 spawn() 时立即终止。
我在 main 中有另一种方法,每秒由一个事件触发:
@QtCore.pyqtSlot()
def cleanup(self):
for t in self.items:
if t.isFinished():
self.items.remove(t)
这会在子线程完成时删除它们。我的问题是:
- 我什至需要这样做吗?python gc 会为我提供这些参考资料吗?
- 有没有更好的方法来清理引用而不是每秒循环遍历整个线程列表?我考虑过的一种方法是将线程存储在键为 Thread-n 的字典中。子线程本身将通过事件触发清理。
编辑:所以我最终做的是使用 QThreadPool 来管理我的线程而不是重新发明轮子,所以现在我有一些看起来像:
...
self.pool = QTCore.QThreadPool()
...
@QtCore.pyqtSlot(str)
def spawn(self):
download_t = DownloadWorker() #this subclasses QtCore.QRunnable
download_t.talker.result.connect(self.exec_js) #result is a QObject to handle
#signals
self.pool.start(download_t)
不再需要轮询清理!