1

我正在使用 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)

这会在子线程完成时删除它们。我的问题是:

  1. 我什至需要这样做吗?python gc 会为我提供这些参考资料吗?
  2. 有没有更好的方法来清理引用而不是每秒循环遍历整个线程列表?我考虑过的一种方法是将线程存储在键为 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)

不再需要轮询清理!

4

0 回答 0