PyQt 异步任务 多线程的几种方案

server/2025/1/22 9:18:01/

多线程异步线程是我们常用的,如我们在执行耗时操作,又不想卡用主程序 ;

1. QThread 

from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
import timeclass WorkerThread(QThread):progress = pyqtSignal(int)  # 定义信号def __init__(self,main_instance):QThread.__init__(self)self.main_instance = main_instancedef run(self):for i in range(1, 101):self.main_instance.excuteSomeThing()self.progress.emit(i)  # 发送信号class MainWindow(QWidget):def __init__(self):super().__init__()self.resize(800, 600)self.initUI()def initUI(self):self.label = QLabel("进度: 0")self.button = QPushButton("开始任务")self.button.clicked.connect(self.start_task)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.button)self.setLayout(layout)def excuteSomeThing(self):time.sleep(0.1)  # 模拟耗时操作def start_task(self):self.worker = WorkerThread(self)self.worker.progress.connect(self.update_label)  # 连接信号到槽函数self.worker.start()  # 启动线程def update_label(self, value):self.label.setText(f"进度: {value}")app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

子线程中回调主线程函数执行,在子线程;

2. QThreadPool

from PyQt5.QtCore import QRunnable, QThreadPool, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
import timeclass WorkerSignals(QObject):progress = pyqtSignal(int)class Worker(QRunnable):def __init__(self):super().__init__()self.signals = WorkerSignals()def run(self):for i in range(1, 101):time.sleep(0.01)  # 模拟耗时操作self.signals.progress.emit(i)  # 发送信号class MainWindow(QWidget):def __init__(self):super().__init__()self.resize(800, 600)self.initUI()self.thread_pool = QThreadPool()def initUI(self):self.label = QLabel("进度: 0")self.button = QPushButton("开始任务")self.button.clicked.connect(self.start_task)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.button)self.setLayout(layout)def start_task(self):worker = Worker()worker.signals.progress.connect(self.update_label)self.thread_pool.start(worker)def update_label(self, value):self.label.setText(f"进度: {value}")app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

3.concurrent

from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
from concurrent.futures import ThreadPoolExecutor
import timeclass Worker(QObject):progress = pyqtSignal(int)def do_work(self):for i in range(1, 101):time.sleep(0.021)  # 模拟耗时操作self.progress.emit(i)class MainWindow(QWidget):def __init__(self):super().__init__()self.resize(800, 600)self.initUI()self.executor = ThreadPoolExecutor(max_workers=10)def initUI(self):self.label = QLabel("进度: 0")self.button = QPushButton("开始任务")self.button.clicked.connect(self.start_task)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.button)self.setLayout(layout)def start_task(self):self.worker = Worker()self.worker.progress.connect(self.update_label)self.executor.submit(self.worker.do_work)def update_label(self, value):self.label.setText(f"进度: {value}")app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

总结

  • QThread:适合需要自定义线程逻辑的场景。
  • QRunnable + QThreadPool:适合轻量级、高并发任务。
  • concurrent.futures:简单结合信号与槽机制使用线程池。

http://www.ppmy.cn/server/160411.html

相关文章

Linux计划任务(crontab)

Linux计划任务(crontab) 计划任务(crontab)周期性任务计划 cron系统cron任务用户cron任务cron 程序日志文件cron 时间表示法 示例创建cron任务查看cron任务查看执行日志crontab命令环境变量问题其他 计划任务(crontab&…

频繁刷新网页会对服务器造成哪些影响?

当用户在进行浏览网页的过程中频繁刷新页面时,浏览器会向服务器发送请求,服务器会对该请求进行处理并返回到相应的页面内容中,所以频繁刷新网页会对服务器造成影响,有可能会出现以下问题: 用户每次刷新网页都会向服务器…

在VS2022中用C++连接MySQL数据库读取数据库乱码问题

1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 (1)右键项目,打开属性 注意是右键项目,不是.cpp文件 (2)配置属性-> VC目录 -> 包含目录 ->添加头文件路径(如图&am…

CSS语言的数据类型

CSS数据类型详解 CSS(层叠样式表)作为网页设计中的重要组成部分,主要用于控制网页的布局、样式和外观。CSS的强大之处在于其丰富的数据类型,这些数据类型决定了我们如何在网页上应用样式。本文将详细介绍CSS的各种数据类型&#…

Whisper-GPT:混合表征音频大语言模型

Whisper-GPT:混合表征音频大语言模型 当下,利用从神经压缩算法(例如#Encodec#​)派生的离散音频标记的生成式音频、语音以及音乐模型数量激增。然而,这种方法的主要缺陷之一在于对上下文长度的处理。如果必须考虑所有不同频率的音频内容才能进行下一个标记预测,那么高保…

去哪儿kafka优化案例

一、背景介绍 集群概况 去哪儿旅行当前KAFKA日志集群节点145台。单机配置:3TSSD盘,40核,128G内存。 业务背景 日志KAFKA集群承载了全司的APPCODE日志,比如我们常用的QTRACE日志,以及实时离线数仓数据。体量非常大。…

实现一个自己的spring-boot-starter,基于SQL生成HTTP接口

上一篇博文介绍了Spring Boot Starter,这次我们就实现一个自己的starter模块,引入了该模块,项目就自然具有了通过配置SQL自动生成HTTP接口的能力。 完整代码可以到github下载:https://github.com/chengpei/sqlapi-spring-boot-sta…

win32汇编环境,窗口程序中复杂列表框的应用举例

;运行效果 ;双击到根目录后 ;win32汇编环境,窗口程序中复杂列表框的应用举例 ;在窗口程序中生成复杂列表框,增加子项,删除某项,取得指定项内容,在列表框内展示某文件夹内的文件列表,选定某文件夹后双击打开,返回上层目录再打开等 ;直接抄进RadAsm可编译运行。重点部分加备…