You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现暂停/sleep()功能且不会导致Kivy应用退出时崩溃卡顿?

问题原因

你遇到的关闭卡顿、需要多次点击才能退出的问题核心有两个:

  1. 你创建的线程默认是非守护线程,Python主进程退出前必须等待所有非守护线程执行完毕,所以点击关闭按钮后,主程序会卡在等待sleep执行完成的阶段,多次点击会被系统判定为无响应。
  2. 你的代码每次执行完更新检查后都会重新创建新线程,相当于无限递归生成新线程,运行时间越久线程数量越多,资源占用持续升高,最终会引发崩溃。

修复方案

  • 给线程设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:42:00