当QThreadPool没空时退出?

时间:2013-12-30 17:22:25

标签: python multithreading python-2.7 pyqt threadpool

我在Python应用程序的后台运行了很多长时间运行的任务。我将它们全部放在全球QThreadPool中。当用户退出时,所有这些后台任务都需要停止。

现在,我有以下代码:

app.aboutToQuit.connect(killAllThreads)

def killAllThreads():
    QtCore.QThreadPool.globalInstance().waitForDone()

我已经看到了添加一个全局变量的建议,该变量说明应用程序是否应该退出,并且让线程自行终止,但这听起来像是一个非常混乱和不优雅的解决方案。您是否真的建议在后台任务中的每行代码之前添加一个检查,以确保应用程序不应该退出?这是我必须添加的数百项检查。

该建议似乎假设我的任务很简单和/或涉及复杂的清理,但实际上,我恰恰相反:任务涉及数百行代码,每行代码可能需要几秒钟,但是根本不需要进行清理。

我听说简单地杀死线程是一个坏主意,因为他们不能保证正确清理,但由于不需要清理,这正是我想要做的。此外,竞争条件可能会发生,但同样,任务需要立即停止,所以我真的不在乎它们是否最终处于无效状态。

所以我需要知道以下内容:

  1. 如何获取QThreadPool
  2. 中所有正在运行的主题的列表
  3. 我如何让他们中止他们正在做的事情?

2 个答案:

答案 0 :(得分:2)

这个问题的简单答案是你不能中止QThreadPool中的任何线程,因为它们被包装在QRunnable的实例中。没有外部方法来终止QRunnable;它必须从重新实现的run()方法中终止自己。

但是,听起来run()方法中运行的任务不适合定期检查标志以查看它们是否应该终止。

如果是这种情况,您只有两个选择:

  1. 定期检查标志的方式重新编写任务。
  2. 请勿使用QThreadPool / QRunnable。
  3. 显然,选择(2)意味着切换到更低级别的解决方案,如QThread,并自行管理线程池。

答案 1 :(得分:1)

使用守护进程,它们会在主线程结束时自动终止

from threading import Thread
t = Thread(target=self.ReadThread)
t.setDaemon(True)