目录
零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门
Python 中除了线程互斥锁 Lock 还有 GIL 锁,GIL 锁全称:Global Interpreter Lock,任何 Python 线程 threading 执行前,必须先获得 GIL 锁才能执行,当线程获取到 GIL 锁之后,每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行。
GIL 全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在 Python 中只能交替执行,即使 100 个线程跑在 100 核 CPU 上,也只能用到 1 个核 – 不能有效的利用计算机资源,效率低下,并非真正意义上的多线程;而真正的多线程执行时,如果有 100 个线程跑在 100 核 CPU 上,那么就能用到 100 个核 – 充分利用计算机资源,高效率( C 语言 / Java 等等都是如此….)。
一.并行和并发
在 Python 线程 threading 与进程 Process 区别 的文章中有介绍关于并行和并发的简单讲解,在讲解 GIL 之前,有必要在补充一下关于并行和并发的知识;
并行:多个 CPU 同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的 CPU 内同时被执行。
举个栗子:老王想打麻将,一缺三,分别同时给张三 / 李四 / 王五三位基友打电话,半个小时内集合打麻将,张三李四王五接到电话后,立即出发赶往老王家,张三李四王五的行为就属于并行;累计耗时:0.5 小时;
并发:CPU 交替处理多个任务,还是有两个程序,但是只有一个 CPU,会交替处理这两个程序,而不是同时执行,只不过因为 CPU 执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。大家可以参考下图的实物图就行理解:
举个栗子:老王想打麻将,一缺三,先给张三打电话,半小时内来我家集合打麻将,张三接到电话后立即赶往老王家;张三到了之后老王立即给李四打电话,半小时内来我家集合打麻将,李四接到电话后立即赶往老王家;李四到了之后老王立即给王五打电话,半小时内来我家集合打麻将,王五接到电话后立即赶往老王家;张三李四王五的行为就属于并发;累计耗时:1.5 小时;
并行和并发同属于多任务,目的是要提高 CPU 的使用效率。这里需要注意的是,一个 CPU 永远不可能实现并行,即一个 CPU 不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。
二.GIL 锁
GIL – 也称锁全局解释器锁(global interpreter lock),每个线程在执行时候都需要先获取 GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用 CPU ,也就是说多线程并不是真正意义上的同时执行。
案例一:单核多线程
案例二:单核多线程
案例三:双核多线程
由上所述:由于 GIL 锁的存在,多线程并不会充分调用两个 CPU ,而是会像在一个 CPU 上充分运转,而多进程则是会完全调用两个 CPU ,同时执行;
很多小伙伴可能会疑惑: Python 线程存在 GIL 锁问题,难道进程 Process 就不存在这个问题嘛?你需要明白:线程共享资源,进程会复制一份资源,进程与进程之间互不影响!
三.如何解决 GIL 锁问题
- 1.使用多进程完成多线程的任务
- 2.在使用多线程可以使用 c 语言去实现
四.猜你喜欢
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
- Python 不定长参数 *argc/**kargcs
- Python 匿名函数 lambda
- Python return 逻辑判断表达式
- Python is 和 == 区别
- Python 可变数据类型和不可变数据类型
- Python 浅拷贝和深拷贝
- Python 异常处理
- Python 线程创建和传参
- Python 线程互斥锁 Lock
- Python 线程时间 Event
- Python 线程条件变量 Condition
- Python 线程定时器 Timer
- Python 线程信号量 Semaphore
- Python 线程障碍对象 Barrier
- Python 线程队列 Queue – FIFO
- Python 线程队列 LifoQueue – LIFO
- Python 线程优先队列 PriorityQueue
- Python 线程池 ThreadPoolExecutor(一)
- Python 线程池 ThreadPoolExecutor(二)
- Python 进程 Process 模块
- Python 进程 Process 与线程 threading 区别
- Python 进程间通信 Queue / Pipe
未经允许不得转载:猿说编程 » Python GIL 锁
本文由博客 - 猿说编程 猿说编程 发布!