说明
- 本代码来源于一个项目中的一部分,这里只展示了多线程部分
- 使用线程池进行网络的一些操作
"""
登陆模块多线程
"""
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:
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.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__()
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()