gpt4 book ai didi

python - 当 QThreadPool 不为空时退出?

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:33 26 4
gpt4 key购买 nike

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

现在,我有以下代码:

app.aboutToQuit.connect(killAllThreads)

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

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

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

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

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

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

最佳答案

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

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

如果是这样的话,你只有两个选择:

  1. 重新编写任务,使其可以定期检查标志。
  2. 不要使用 QThreadPool/QRunnable。

显然,选择 (2) 意味着切换到更底层的解决方案,例如 QThread ,并自行管理线程池。

关于python - 当 QThreadPool 不为空时退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com