- 线程是最小的执行单位,进程由至少一个线程组成。
- 如何调度进程和线程完全由操作系统决定。
一、关于GIL(全局解释器锁)
GIL会保证同时只能有一个线程运行。
在多线程环境中,Python 虚拟机会按照以下步骤执行:
- 设置GIL。
- 切换进一个线程去运行。
- 执行下面操作之一。
- 指定数量的字节码指令。
- 线程主动让出控制权(可以调用time.sleep(0)来完成)。
- 把线程设置回睡眠状态(切换出线程)。
- 解锁GIL。
- 重复以上步骤
二、什么是线程
- 线程也称为轻量级进程与进程类似,不过他们是在同一个进程下执行的。
- Python线程中的模块:thread & threading 模块
- Python提供了多个模块支持多线程编程,包括thread、threading和Queue模块等。
- threading相比thread模块提供了更高级别、功能更全面的线程管理。
三、Python中线程的使用
1.线程的创建、启动、阻塞
关于threading.Thread 来生成一个类的对象。
- 将常用到的参数有target和args,target为需要调用的函数名称,args就是要传递进target函数的参数,
- 当传入参数args只有一个时,格式为:
t=threading.Thread(target=loop,args=(3,))
- t.start()来启动线程,t.join()来阻塞,一直等到线程完成。
2.关于线程的派生类
使用线程的派生类来操作很干净,整洁,容易维护。
3.线程的停止
线程的停止,使用join()等待它结束,或者使用daemon(守护线程),当主线程完成,子线程自动退出。
关于守护线程
- 避免使用thread模块的另一个原因是该模块不支持守护线程这个概念。当主线程退出时,所有子线程都将终止,不管完成与否。
- 要将一个线程设置为守护线程,需要在启动线程之前执行
thread.daemon = Ture
到这里我们可以理解为:主线程将在所有非守护线程退出之后才退出。
四、线程的创建方法
比较相似的三个方法:
- 创建Thread的实例,传给它一个函数
- 创建Thread的实例,传给它一个可调用的类实例
- 派生Thread的子类,并创建子类的实例
网友评论