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

news/2025/1/31 1:08:15/

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

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/news/1568022.html

相关文章

Linux查看服务器的内外网地址

目录: 1、内网地址2、外网地址3、ping时显示地址与真实不一致 1、内网地址 ifconfig2、外网地址 curl ifconfig.me3、ping时显示地址与真实不一致 原因是dns缓存导致的,ping这种方法也是不准确的,有弊端不建议使用,只适用于测试…

新年快乐!!Market Moments 重磅更新!

2025 新年快乐!在这个充满希望的新年里,愿大家都能心想事成,学业进步,健康快乐! 随着新年的到来,Market Moments 也迎来重磅更新! 首先,首页进行了改版升级,现在你可以在…

HTB:Cicada[RE-WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

【反悔堆】力扣1642. 可以到达的最远建筑

给你一个整数数组 heights ,表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。 当从建筑物 i 移动到建筑物 i1(下标 从 0 开始 )…

元素的显示与隐藏

display显示隐藏visibility显示隐藏overflow溢出显示隐藏 display属性 visibility属性 overflow溢出

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…

python爬虫验证下载的图片是否损坏方法

一、最佳方法 使用PIL库的Image进行验证,简单明了 from PIL import Image import io import requestsdef is_image_valid(resp):try:with Image.open(io.BytesIO(resp.content)) as img:img.verify() # 验证图片是否有效return Trueexcept Exception as e:print(f&…

基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结

title: 基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结 tags: - jenkins - python categories: - jenkins在软件开发的持续集成与持续交付(CI/CD)流程里,及时、准确地获取并分析测试报告对保障软件质量至关重要。本文将详细…