干货:长任务反馈

长任务反馈:daemon 线程 + 信号 vs 直接阻塞的取舍

长任务,界面不能卡

识一个目录要好几秒。如果你在按钮回调里直接同步跑,界面就彻底卡死,用户以为程序死了。

第一性原理:长时间任务必须离开 UI 线程,用后台线程跑,然后靠信号把进度/结果送回来更新界面。

两种 vi 思路

做法一:直接阻塞(错)

python 复制代码
def _on_click(self):
    self.split_btn.setEnabled(False)
    heavy_work(self.pdf)     # 阻塞UI好几秒,界面死给你看
    self.split_btn.setEnabled(True)

界面在这几秒里无法响应、无法重绘,体验极差。

做法二:daemon 线程 + 信号(对)

python 复制代码
def _run_split(self):
    ...
    threading.Thread(target=self._split_worker, daemon=True).start()

def _split_worker(self):
    result = step_split(self._pdf, self._plugin, temp_dir)
    self.split_done.emit(result)     # 信号回到主线程

后台线程算,算完 emit 信号,主线程在 connect 的槽里更新界面、恢复按钮。

daemon=True 的意义

daemon=True 表示这是守护线程:主程序退出时它自动被拖死,不会阻塞程序关闭。

python 复制代码
threading.Thread(target=self._split_worker, daemon=True).start()

对我们的场景,任务跑不完程序要退出,直接放弃即可,不用等它------这正合适。

取舍结论

  • 直接阻塞:禁止,UI 卡死。
  • daemon + 信号:UI 顺畅,退出无牵挂,结果靠信号回主线程更新。

别每次看按钮回调里放一堆重活,一律走"后台线程跑 + 信号回主线程"。这条天花板,PySide6 项目尤其重要。


相关推荐
威哥爱编程5 分钟前
模拟面试智能体开发实战 05:给面试官接上题库和检索,题目结构化、大纲可溯源,AI 不再凭印象出题
python·agent·harmonyos
威哥爱编程6 分钟前
模拟面试智能体开发实战 06:答得好怎么追问、答得错怎么点破,追问引擎让面试官会深挖会纠错
python·agent·harmonyos
codists1 小时前
《crafting interpreters》阅读笔记:4.6.2
python
2601_967979121 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
cpolar技术支持1 小时前
listen(5) 只排得住 5 个连接:第 6 个客户端卡在 connect 超时,进程活着端口却显示假活不放行
python·socket·tcp·cpolar·故障排查
梯度下降者2 小时前
我校学子斩获 2025 全国高新技术竞赛 Python 赛道全国一等奖
python·教育·竞赛·信息技术·人才培养
小小张说故事2 小时前
Python 的 memoryview 为什么能零拷贝:拆开 buffer protocol、cast 和那道 BufferError
python
Hvitur3 小时前
Java - Lambda
java·开发语言·python
2601_967980113 小时前
win10如何把python加入环境变量
python·win10·安装教程·命令行·环境变量
锋行天下11 小时前
langgraph 后端发自定义数据,前端接收方法概括
人工智能·python