【问题标题】:Process Doesn't End When Closed关闭时进程不会结束
【发布时间】:2013-01-10 18:53:56
【问题描述】:

我用 Python 构建了一个网络爬虫应用程序。它由三个主要部分组成:

  1. GUI(基于 tkinter 构建)
  2. 客户端(控制前端和后端之间的接口)
  3. 后端代码(各种线程化进程)。

我遇到的问题是,当用户点击 X 退出程序而不是通过界面退出时,似乎 root.destroy() 永远不会被调用并且应用程序永远运行,即使窗口确实消失了。这最终会消耗大量系统资源。

我尝试将所有线程设置为 Daemon,但没有取得多大成功。退出后程序会继续占用 CPU 是否还有其他原因?

【问题讨论】:

  • 你的程序是多线程的。是否有可能当一个线程结束(gui)时,其他线程仍然存在?

标签: python tkinter


【解决方案1】:

您不想将所有线程设置为daemon。您想将客户端线程和后端线程设置为守护进程。这样,当 GUI 线程终止时,daemon 设置为 True 的线程也会结束。

来自documentation

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。

【讨论】:

  • 那么... GUI 线程应该设置为守护进程吗?子线程呢?后端线程产生许多子线程。我可以将父线程设置为守护进程,还是这些都应该是守护进程?
  • @AdrianLarson 是的,这就是我要说的。一个简单的方法是将每个线程设置为除 GUI 之外的守护线程。这包括后端线程产生的所有子线程。
  • 是的,我只需要将它们全部猎杀。包中有很多模块,所以幸运的是我一直在使用 from threading import Thread,它很容易替换为:from ..package.sub import DaemonThread as Thread b> 使所有生成的线程成为守护进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多