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