多线程+PyQt5打包的EXE程序无响应 功能不执行 弹出很多相同窗口

news/2024/7/9 8:30:26 标签: qt, python, bug, sklearn, 机器学习

问题背景描述:项目程序涉及到机器学习,需要实现机器学习模型的寻参和训练,封装到应用程序中,由于模型训练需要较多时间,所以会出现程序打包成exe之后,触发模型训练之后会出现程序“无响应”的卡死现象,并且程序卡死之后会产生很多个新的相同窗口,而且实际上模型没有训练(程序本身在PycharmIDE中测试没有任何问题)

解决路径

考虑的解决方案思路如下:

  1. 使用多线程,启动新的线程来执行耗时的模型训练和寻参过程
    pyqt中的多线程模块使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题。用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭。这样,导致工具的用户使用体验不好。
    参考Python GUI程序运行时,如果点击按钮运行了一个比较耗时的操作,那么界面会卡死提示未响应。原因是主进程执行耗时等待
  2. 在程序设计的时候考虑到各部分的耗时,将各个环节分开
  3. 前端增加提示,提示训练开始与结束已经可能会训练很久,增加对用户的友好性

上述修改都没有带来根本上的问题解决

最后通过单元测试,定位到模型寻参模块的代码,最终发现,在python-sklearn中使用的RandomizedSearchCV中设置了多线程寻参的模式,将多线程改成了单线程,将程序就可以正常运行了,只不过由于单线程寻参,寻找的过程时间变长了。

分析分析问题成因

Q:我的程序出现的问题是这样子的:就是在我点击开始模型训练的时候,程序就无响应了,同时它产生了很多个相同的程序界面,但是它实际上并没有开始训练模型,就卡在那里了
A:这种情况可能是由于程序在启动训练模型时,进入了一个死循环或者阻塞了主线程,导致程序无响应并且创建了多个相同的程序界面
为了排除这个问题,您可以尝试在程序中添加一些调试信息来帮助您确定程序的执行过程中具体卡在了哪里,比如使用日志记录程序执行状态,或者在程序中添加调试语句。此外,您还可以尝试在程序启动训练模型之前添加一些提示信息或者进度条等界面元素,以便您更好地了解程序的执行情况。
如果您无法通过调试信息解决问题,可以尝试使用 Python 的多线程或异步编程技术,以避免阻塞主线程。另外,您也可以尝试使用 Python 的调试工具(如 pdb 或 PyCharm 的调试工具)来帮助您找到程序的问题所在。

Q:为什么阻塞了主线程就会创建多个相同的程序界面呢?
A:当程序阻塞主线程时,通常意味着主事件循环被阻塞,导致程序无法响应用户输入或者界面事件。在这种情况下,如果程序中有其他线程或进程正在运行,它们可能会继续执行,并且可能会创建新的界面或者窗口,导致出现多个相同的程序界面。
这种情况的具体原因可能是因为您的程序中某个长时间运行的任务阻塞了主线程,例如模型训练任务。当用户点击“开始模型训练”按钮时,程序会启动该任务,并将其放入主线程中执行。如果该任务的执行时间很长,主线程就会被阻塞,无法响应用户输入或者界面事件。在这种情况下,程序可能会继续运行其他任务(例如处理用户输入的代码),这些任务可能会创建新的界面或者窗口。
为了避免这种情况,您可以使用多线程或者异步编程技术,将长时间运行的任务放在一个单独的线程或进程中执行,以避免阻塞主线程。在 PyQT5 中,您可以使用 QThread 或者 QRunnable 来创建新的线程,从而在后台运行长时间任务。另外,您也可以使用 asyncio 库来实现异步编程,从而在后台运行长时间任务,而不会阻塞主线程。
如果您想了解如何在 PyQt5 中使用多线程或异步编程技术来避免阻塞主线程的问题,可以搜索以下关键词:

  • PyQt5 threading
  • PyQt5 QThread
  • PyQt5 QRunnable
  • PyQt5 async programming
  • Python threading
  • Python asyncio

http://www.niftyadmin.cn/n/178472.html

相关文章

安装好unity后给unity配置及插件和资源相关的事情

自从unity出了hub后,安装起来非常的方便,基本上都可以通过hub完成自动安装,而且也会为我们配置好vs编辑器的开发环境(包括工作负荷unity)。我们可能会遇到某些特殊的情况,需要我们单独的配置unity&#xff…

css总结10(动画)

前言 动画实现就两个环节:创建动画(keyframes),绑定到元素(animation); 所以理清这两个知识,动画就很简单; 入门示例 .box {width: 200px;height: 200px;background-color: red;animation: am1 5s; } keyframes am1 …

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了 熟悉RT-Thread和瑞萨MCU的朋友都知道,当前RT-Thread仓库的主线代码是不支持RA2E1这个BSP的。刚好,最近我在联合瑞萨推广一个叫《致敬未来的攻城狮计划》,使用的就是RA2E1开发板&…

以太网基础-MAC和PHY

(596条消息) 以太网基础-MAC和PHY_mac phy_奇小葩的博客-CSDN博客(596条消息) 以太网PHY原理介绍_king110108的博客-CSDN博客.PHY物理层位于OSI最底层,物理层协议定义电气信号、线的状态、时钟要求、数据编码和数据传输用的连接器。 物理层的器件称为PHY。PHY是物理…

设计循环链表C语言——力扣622题

题目地址->设计循环链表 题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之…

如何加强zabbix_agent的安全

agent安装方式编译安装agent工作模式主动模式Zabbix_agentd.conf主动模式的参数配置Server127.0.0.1 #被动模式连接的Zabbix-Server的IP地址。ServerActive10.10.10.10 #主动模式连接的Zabbix-Server的IP地址,开启此项参数,将会自动打开主动模式&#xf…

Golang每日一练(leetDay0014)

目录 40. 组合总和 II Combination Sum II 🌟🌟 41. 缺失的第一个正数 First Missing Positive 🌟🌟🌟 42. 接雨水 Trapping Rain Water 🌟🌟🌟 🌟 每日一练刷题…

代码误写到master分支(或其他分支),此时代码还未提交,如何转移到新建分支?

问题背景 有时候,我们拿到需求,没仔细看当前分支是什么,就开始撸代码了。完成了需求或者写到一半发现开发错分支了。 比如此时新需求代码都在master分支上,提交必然是不可能的,所有修改还是要在新建分支上进行&#x…