私はpyqt4のQThreadsを扱っています。常に実行されているスレッドがあります。それをメインと呼びましょう。コンストラクターでは、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() を離れるとすぐにスレッドが停止します。
メインには、毎秒イベントによってトリガーされる別のメソッドがあります。
@QtCore.pyqtSlot()
def cleanup(self):
for t in self.items:
if t.isFinished():
self.items.remove(t)
これにより、終了時に子スレッドが削除されます。私の質問は:
- これを行う必要がありますか?Python はこれらの参照を gc しますか?
- スレッドのリスト全体を毎秒ループせずに参照をクリーンアップするより良い方法はありますか? 私が検討した 1 つの方法は、キーが Thread-n である dict にスレッドを格納することです。子スレッド自体は、イベントでクリーンアップをトリガーします。
編集:だから私がやったのは、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)
クリーンアップのためにポーリングする必要はもうありません。