python pyqt5 多线程池的使用案例

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()

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PythonPyQt5中,处理多线程主要有三种方法。第一种是使用计时器模块QTimer,第二种是使用多线程模块QThread,第三种是使用事件处理功能。 在第二种方法中,需要编写一个线程类文件,并在其中定义一个自定义信号。然后在run()函数中编写希望在线程中执行的操作。例如,可以使用time.sleep()函数实现计时操作,并通过emit函数将参数传递给主线程,从而触发自定义信号。 在第三种方法中,需要导入前面两个文件,并定义一个包含相关逻辑操作的类。可以通过实例化一个线程,并设置参数,然后将线程的信号与UI主线程中的槽函数进行连接。最后,启动线程并接收通过emit传来的信息,执行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PYQT5实现多线程的方法](https://blog.csdn.net/GDUT_ZXM/article/details/121353212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [PyQt5自学记录(1)——PyQt5多线程实现详解](https://blog.csdn.net/qq_40784418/article/details/105398870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值