多线程
多任务¶
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。
现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行 多任务。
多任务的优势¶
多任务表现形式¶
window下打开任务管理器可以很清晰看到多个进程在同时执行任务,qq、微信等都是已进程的形式寄存在window下。大多我们在写一些控制台程序真正执行的时候都是以进程调度。
Python默认是单任务¶
接下来我们使用python代码来模拟“唱歌跳舞”这件事情
import time
def sing():
"""唱歌函数"""
for i in range(3):
print("正在唱歌..")
time.sleep(0.5)
def dance():
"""跳舞函数"""
for i in range(3):
print("正在跳舞..")
time.sleep(0.5)
if __name__ == '__main__':
sing() # 正在唱歌
dance() # 正在跳舞
Note
- 很显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求
- 如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务
线程¶
概念¶
线程,可简单理解为是程序执行的一条分支,也是程序执行流的最小单元。
线程 是被CPU独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
主线程:
当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的 主线程.
简而言之:程序启动就会创建一个主线程。
主线程的重要性有两方面:
- 是产生其他子线程的线程;
- 通常它必须最后完成执行比如执行各种关闭动作。
子线程:
可以看做是程序执行的一条分支,当子线程启动后会和主线程一起同时执行
threading模块¶
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用.
核心方法¶
- threading.Thread(target=函数名) threading模块的Thread类 创建子线程对象
- 线程对象.start() 启动子线程
代码实现¶
import time
import threading
def say_sorry():
print("亲爱的,我错了,我能吃饭了吗?")
time.sleep(1)
if __name__ == '__main__':
for i in range(5):
# 创建子线程的的方法
# 1、导入 threading 模块
# 2、使用 threading.Tread() 方法,创建子线程对象
# threading.Thread(target=函数名, args=(参数列表,元组))
t1 = threading.Thread(target=say_sorry)
# 3、使用子线程对象调用start() 方法,可以开启子线程(子线程将同时执行)
t1.start()
print("我是主线程")
运行结果:
说明¶
- 可以明显看出使用了多线程并发的操作,花费时间要短很多
- 当调用start()时,才会真正的创建线程,并且开始执行
- 每个线程都有一个唯一标示符,来区分线程中的主次关系
- 主线程:mainThread,Main函数或者程序主入口,都可以称为主线程
- 子线程:Thread-x 使用 threading.Thread() 创建出来的都是子线程
- 线程数量:主线程数 + 子线程数
GUI实现¶
def __init_third(self, layout):
rpm_group = QGroupBox('转速显示')
rpm_layout = QFormLayout(rpm_group)
layout.addWidget(rpm_group)
self.__init_rpm_ui(rpm_layout)
def __init_rpm_ui(self, layout):
self.__lb_rpm = QLabel()
layout.addRow('转速(圈/秒)', self.__lb_rpm)