欢迎访问宙启技术站
智能推送

PyQt5.QtCore.QThread:使用QThreadPool管理并行任务

发布时间:2024-01-04 14:57:30

PyQt5是一个Python编写的跨平台的图形用户界面GUI框架,它集成了一系列的模块,包括QtCore模块,用于处理事件循环、定时器和线程等核心功能。QThread是其中的一个类,用于创建线程并管理并行任务。

QThread类继承自QtCore.QObject类,是一个多线程编程的核心类。使用QThread可以创建并行的任务,将任务分发给不同的线程进行执行,从而提高程序的运行效率。QThreadPool是一个线程池类,用于管理线程对象。

下面是一个使用QThread和QThreadPool的简单示例:

from PyQt5.QtCore import QThread, QThreadPool, pyqtSignal

# 自定义的任务类,继承自QThread类
class MyTask(QThread):
    # 定义一个信号,用于任务完成后的返回结果
    finished = pyqtSignal(str)

    def __init__(self, name):
        super().__init__()
        self.name = name

    # 重写run方法,实现任务的逻辑
    def run(self):
        result = self.process()  # 调用任务逻辑处理方法
        self.finished.emit(result)  # 发送任务完成的信号

    # 任务逻辑处理方法
    def process(self):
        # 模拟耗时操作
        self.sleep(2)
        return f'Task {self.name} finished'


# 主线程的入口
if __name__ == '__main__':
    # 创建线程池对象
    threadpool = QThreadPool()

    # 创建3个任务对象,分发到线程池执行
    for i in range(3):
        task = MyTask(name=f'Task{i+1}')
        task.finished.connect(lambda result: print(result))  # 绑定任务完成的信号
        threadpool.start(task)

    # 主线程不阻塞,继续执行其它操作
    print('Main thread continues...')

上述代码中,先定义了一个自定义任务类MyTask,继承自QThread类,并实现了run方法和process方法。run方法是QThread类的虚函数,在其中调用了process方法来实现任务的逻辑。process方法模拟了一个耗时操作,然后返回任务的执行结果。

在主线程中,创建了一个线程池对象threadpool,然后创建3个任务对象,分发到线程池中执行。每个任务对象都绑定了一个finished信号,当任务完成后会发送该信号,并将任务的执行结果作为参数传递给槽函数。在本例中,槽函数简单地打印了任务的执行结果。

最后,主线程不阻塞,继续执行其它操作。当所有任务完成后,主线程依然可以继续运行。

通过使用QThreadQThreadPool,我们可以很方便地实现并行任务的管理和分发,提高程序的运行效率。