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

你可能感兴趣的:(Python案例)