python pyqt5 多线程池的使用案例

本文介绍了一个使用PyQt5实现的多线程池案例,通过具体代码展示如何利用线程池进行网络操作,如登陆验证。案例中详细解释了线程池的创建、任务分配与线程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python pyqt5 多线程池的使用案例

说明

  1. 本代码来源于一个项目中的一部分,这里只展示了多线程部分
  2. 使用线程池进行网络的一些操作
# -*- coding: utf-8 -*-
"""
登陆模块多线程
"""
from PyQt5.QtCore import QRunnable, QObject, QThreadPool, QThread
from core.logicalCode.login import seleniumLogin, cookiesLogin


class Thread(QRunnable):
    def __init__(self):
        """
        任务
        """
        super(Thread, self).__init__()
        self.user = self.password = self.cookies = None
        self.communicate = None

    def transfer(self, user="", password="", cookie="", communicate=None):
        """
        传递数据
        :param user:
        :param password:
        :param cookie:
        :param communicate:信号机制
        :return:
        """
        self.user = user
        self.password = password
        self.cookies = cookie
        self.communicate = communicate

    def run(self):
        """
        开始执行
        :return:
        """
        if self.user and self.password:
            # print("线程测试", self.user, self.password)
            try:
                login = seleniumLogin.SeleniumLogin()
                login.communicate_emit_connect(self.communicate)
                login.main(user=self.user, password=self.password)
            except Exception as e:
                self.communicate.writerLog.emit(e, False)
                self.communicate.writerLog.emit("登陆程序出现了未知故障!", False)
        else:
            login = cookiesLogin.CookiesLogin()
            login.communicate_emit_connect(self.communicate)
            login.main(self.cookies)
        self.communicate.progress_count.emit()


class Tasks(QObject):
    def __init__(self, data_info, communicate, thread_count):
        """
        线程池,分配任务,结束任务
        :param data_info: 字典
        :param communicate: 信号
        :param thread_count: 线程数
        """
        super(Tasks, self).__init__()
        self.data_info = data_info
        self.thread_count = thread_count
        self.communicate = communicate

        self.pool = QThreadPool()  # 创建线程池
        self.pool.globalInstance()  # 获得这个全局线程池
        # self.pool = QThreadPool.globalInstance()  # 获得这个全局线程池

        self.communicate.thread_stop.connect(self.thread_stop)

    def thread_stop(self):
        """
        停止线程
        注意:
            这里只实现了清除线程池还未开始线程的队列
        :return:
        """
        self.pool.clear()

    def start(self):
        self.pool.setMaxThreadCount(self.thread_count)  # 设置最大线程数
        if self.data_info["auth"] == "user":
            login_info = self.data_info["login"]
            self.communicate.thread_total.emit(len(login_info))
            for user, password in login_info:
                thread_ins = Thread()
                thread_ins.setAutoDelete(True)  # 是否线程池替你删除
                thread_ins.transfer(user=user, password=password, communicate=self.communicate)
                self.pool.start(thread_ins)
        else:
            login_info = self.data_info["login"]
            self.communicate.thread_total.emit(len(login_info))
            for cookie in login_info:
                thread_ins = Thread()
                thread_ins.setAutoDelete(True)  # 是否线程池替你删除
                thread_ins.transfer(cookie=cookie, communicate=self.communicate)
                self.pool.start(thread_ins)
        self.pool.waitForDone()  # 等待线程结束
        self.communicate.writerLog.emit("线程执行完毕!", True)
        self.communicate.progress_success.emit()
        self.communicate.start_to_stop.emit()


class TasksThread(QThread):
    def __init__(self, data_info, communicate, thread_count=8):
        """
        主线程,主程序防止卡死
        :param data_info: 字典
        :param communicate: 信号
        :param thread_count: 线程数
        """
        super(TasksThread, self).__init__()
        # task 需要在这里进程初始化,否则信号机制会失效
        self.task = self.task = Tasks(data_info=data_info,
                                      communicate=communicate,
                                      thread_count=thread_count
                                      )

    def run(self):
        self.task.start()


if __name__ == "__main__":
    data_info_ = None  # 字典
    communicate_ = None  # 信号机制
    thread_count_ = 8  # 线程数
    tasks_thread = TasksThread(data_info=data_info_,
                               communicate=communicate_,
                               thread_count=thread_count_)
    tasks_thread.start()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值