干货:长任务反馈

长任务反馈: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 项目尤其重要。


相关推荐
严谨的麻辣烫19 分钟前
Python HTTP 连接池怎么用?从连接复用到请求异常排查
开发语言·python·http·requests·网络排查
摇滚侠20 分钟前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
用户83562907805120 分钟前
如何使用 Python 在 Word 文档中创建和格式化列表
后端·python
GIoT801033 分钟前
网络出口如何选择?固定 IP 与 IP 轮换的原理及实践
python
羡林i1 小时前
ProcessPoolExecutor 传参踩坑实测:pickle 失败的四种写法
python
Dmz丶1 小时前
前端转 AI 100 天 Day 30:正式上线——从零部署一个完整服务(含 30 天复盘)
python
稻草人4781 小时前
安装OCA模块
python
用户5065659277761 小时前
回测引擎的五个工程细节:3000 根 4 小时 K 线跑出来的成本差
python
黑妹天下第一乖2 小时前
255 次尝试就能恢复 CA 私钥?这次 TLS 信任链事故,值得每个 AI 开发者警惕
人工智能·python·https·tls·信任链·ca
happylifetree2 小时前
Python68:核心语法-函数进阶-匿名函数(lambda表达式)
python