我在Python应用程序的后台运行了很多长时间运行的任务。我将它们全部放在全球QThreadPool
中。当用户退出时,所有这些后台任务都需要停止。
现在,我有以下代码:
app.aboutToQuit.connect(killAllThreads)
def killAllThreads():
QtCore.QThreadPool.globalInstance().waitForDone()
我已经看到了添加一个全局变量的建议,该变量说明应用程序是否应该退出,并且让线程自行终止,但这听起来像是一个非常混乱和不优雅的解决方案。您是否真的建议在后台任务中的每行代码之前添加一个检查,以确保应用程序不应该退出?这是我必须添加的数百项检查。
该建议似乎假设我的任务很简单和/或涉及复杂的清理,但实际上,我恰恰相反:任务涉及数百行代码,每行代码可能需要几秒钟,但是根本不需要进行清理。
我听说简单地杀死线程是一个坏主意,因为他们不能保证正确清理,但由于不需要清理,这正是我想要做的。此外,竞争条件可能会发生,但同样,任务需要立即停止,所以我真的不在乎它们是否最终处于无效状态。
所以我需要知道以下内容:
QThreadPool
?答案 0 :(得分:2)
这个问题的简单答案是你不能中止QThreadPool中的任何线程,因为它们被包装在QRunnable的实例中。没有外部方法来终止QRunnable;它必须从重新实现的run()
方法中终止自己。
但是,听起来run()
方法中运行的任务不适合定期检查标志以查看它们是否应该终止。
如果是这种情况,您只有两个选择:
显然,选择(2)意味着切换到更低级别的解决方案,如QThread,并自行管理线程池。
答案 1 :(得分:1)
使用守护进程,它们会在主线程结束时自动终止
from threading import Thread
t = Thread(target=self.ReadThread)
t.setDaemon(True)