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

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

  1. QThread

    from PyQt5.QtCore import QThread, pyqtSignal
    from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
    import time

    class WorkerThread(QThread):
    progress = pyqtSignal(int) # 定义信号
    def init(self,main_instance):
    QThread.init(self)
    self.main_instance = main_instance
    def 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_()

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

  1. QThreadPool

    from PyQt5.QtCore import QRunnable, QThreadPool, pyqtSignal, QObject
    from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
    import time

    class 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 time

class 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:简单结合信号与槽机制使用线程池。
相关推荐
冷雨夜中漫步3 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴3 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
JH30734 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919105 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手5 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934735 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy5 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
invicinble5 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat