如何实现暂停/sleep()功能且不会导致Kivy应用退出时崩溃卡顿?
问题原因
你遇到的关闭卡顿、需要多次点击才能退出的问题核心有两个:
- 你创建的线程默认是非守护线程,Python主进程退出前必须等待所有非守护线程执行完毕,所以点击关闭按钮后,主程序会卡在等待sleep执行完成的阶段,多次点击会被系统判定为无响应。
- 你的代码每次执行完更新检查后都会重新创建新线程,相当于无限递归生成新线程,运行时间越久线程数量越多,资源占用持续升高,最终会引发崩溃。
修复方案
- 给线程设置
daemon=True,将其标记为守护线程,主程序退出时会直接终止所有守护线程,不会等待执行完成。 - 取消递归创建新线程的逻辑,改用单个循环线程执行定时任务,降低资源消耗。
- 新增运行状态标志位,重写Kivy App的
on_stop退出回调,触发退出时先修改标志位让线程主动退出,避免强制杀线程可能带来的异常。
完整可运行代码
import time from threading import Thread from kivy.app import App class Test(App): def build(self): # 初始化线程运行标志位 self.running = True self.thread_for_update() def thread_for_update(self): # 设置daemon=True将线程标记为守护线程 p1 = Thread(target=self.check_for_update, daemon=True) p1.start() def check_for_update(self): # 用循环代替递归创建新线程 while self.running: time.sleep(5) # 如果已经触发退出,就不执行后续更新逻辑 if not self.running: break print("Update") # 此处保留原有的更新检查、通知用户逻辑 def on_stop(self): # 应用退出时触发,修改标志位通知线程结束运行 self.running = False Test().run()
额外优化建议
如果希望点击退出后响应更快,不需要等待完整的sleep时长,可以将长sleep拆分为多个短时间片循环判断:
# 把原来的time.sleep(5)替换为下面的逻辑,退出响应延迟最高只有0.1秒 for _ in range(50): if not self.running: break time.sleep(0.1)
内容的提问来源于stack exchange,提问作者PW1990
相关产品推荐
相关产品推荐

