当QThreadPool不为空时退出?

2024-09-28 05:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在,我有以下代码:

app.aboutToQuit.connect(killAllThreads)

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

我看到有人建议添加一个全局变量来说明应用程序是否应该退出,并让线程自行终止,但这听起来是一个非常混乱和不优雅的解决方案。你真的会建议在后台任务中的每一行代码之前添加一个检查,以确保应用程序不会退出吗?我得加上几百张支票。在

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

我听说简单地杀死线程是个坏主意,因为那样的话就不能保证正确地清理线程,但是由于不需要清理,所以这正是我想要做的。此外,可能会出现争用情况,但同样,任务需要立即停止,所以我真的不在乎它们是否以无效状态结束。在

所以我需要知道以下几点:

  1. 如何获取QThreadPool中所有正在运行的线程的列表?在
  2. 我怎么能让他们中止他们的工作?在

Tags: 代码用户app应用程序defconnect全局线程
2条回答

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

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

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

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

如果是这样,您只有两个选项:

  1. 重新编写任务,使它们能够定期检查标志。在
  2. 不要使用QThreadPool/qrunable。在

显然,选择(2)意味着切换到更低级的解决方案,如QThread,并自己管理线程池。在

相关问题 更多 >

    热门问题