[TOC]

线程基本概念


进程:系统中资源分配和资源调度的基本单位,叫作进程。

线程:个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。

多线程的优点

  • 通过网络与web服务器和数据库进行通信。
  • 执行占用大量时间的操作
  • 区分具有不同优先级的任务
  • 使用户界面可用在将时间分配给后台任务时仍能快速做出响应

多线程的缺点

建议一般不要在程序中使用太多的线程,这样可以最大限度地减少操作系统资源的使用,并提高性能

  • 系统将为进程和线程所需的上下文信息使用内存。因此,可用创建的进程和线程的数目会收到可用内存的限制。
  • 跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数线程处于一个进程中,则其他进程中的线程的调度频率就会很低。
  • 使用多个线程控制代码执行非常复制,并可能产生许多Bug
  • 销毁线程需要了解可能发生的问题并进行处理

多线程的实现


在PyQt5中实现多线程主要有两种方法,一种是使用QTimer计时器模块;另一种是使用QThread线程模块

QTimer:计时器

如果需要周期性地执行某项操作,就可以使用QTimer类实现,QTimer类表示计时器,它可以定期发射timeout信号,时间间隔的长度在start()方法中指定,以毫秒为单位,如果要停止计时器,则需要使用stop()方法。

1
2
3
4
5
6
7
from PyQt5.QtCore import QTimer

timer = QTimer(MainWindow)
timer.start() #开始计时器
timer.timeout.connect(槽函数) # 设置计时器要执行的槽函数
# 接下来,timer线程会重复执行槽函数
timer.stop() #停止计时器

QThread:线程类

常用方法

run() 线程的起点,在调用start()之后,新创建的线程将调用该方法
start() 启动线程
wait() 阻塞线程
sleep() 以秒为单位休眠线程
msleep() 以毫秒为单位休眠线程
usleep() 以微秒为单位休眠线程
quit() 退出线程的事件循环并返回代码0(成功),相当于exit(0)
exit() 退出线程的事件循环,并返回代码,如果返回0成功,其他错误
terminate() 强制终止线程,在terminate()之后应该使用wait()方法,以确保当线程终止时,等待线程完成的所有线程都将被唤醒,另外,不建议使用这种方法终止线程
setPriority() 设置线程的优先级:QThread.IdlePriority:空闲优先级QThread.LowestPriority:最低优先级QThread.LowPriority:低优先级QThread.NormalPriority:系统默认优先级QThread.HighPrioriry:高优先级QThread.HighestPriority:最高优先级QThread.TimeCriticalPriority:尽可能频繁地分配执行QThread.InheritPriority:默认,使用与创建线程相同的优先级
isFinished() 是否完成
isRunning() 是否正在运行

信号

started 在调用run()方法之前,在相关线程开始执行时从该线程发射
finished 在相关线程完成执行之前从该线程发射

线程的生命周期


线程也有自己的生命周期,其中包含5种状态,分别为出生状态、就绪状态、运行状态、暂停状态(包括休眠、等待和阻塞等)和死亡状态

Image [4]