Pyqt教程(七)多线程
[TOC]
线程基本概念
进程:系统中资源分配和资源调度的基本单位,叫作进程。
线程:个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。
多线程的优点
- 通过网络与web服务器和数据库进行通信。
- 执行占用大量时间的操作
- 区分具有不同优先级的任务
- 使用户界面可用在将时间分配给后台任务时仍能快速做出响应
多线程的缺点
建议一般不要在程序中使用太多的线程,这样可以最大限度地减少操作系统资源的使用,并提高性能
- 系统将为进程和线程所需的上下文信息使用内存。因此,可用创建的进程和线程的数目会收到可用内存的限制。
- 跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数线程处于一个进程中,则其他进程中的线程的调度频率就会很低。
- 使用多个线程控制代码执行非常复制,并可能产生许多Bug
- 销毁线程需要了解可能发生的问题并进行处理
多线程的实现
在PyQt5中实现多线程主要有两种方法,一种是使用QTimer计时器模块;另一种是使用QThread线程模块
QTimer:计时器
如果需要周期性地执行某项操作,就可以使用QTimer类实现,QTimer类表示计时器,它可以定期发射timeout信号,时间间隔的长度在start()方法中指定,以毫秒为单位,如果要停止计时器,则需要使用stop()方法。
1 | from PyQt5.QtCore import QTimer |
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种状态,分别为出生状态、就绪状态、运行状态、暂停状态(包括休眠、等待和阻塞等)和死亡状态
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一个正常的人!
评论