45.python GIL锁

最后更新于:2020-01-09 10:11:31

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语言去实现

 

猜你喜欢:

1.python线程threading

2.python进程Process

3.python线程互斥锁Lock

4.python进程互斥锁Lock

5.python线程threading与进程Process区别

 

 

转载请注明猿说Python » python GIL锁

 

技术交流、商务合作请直接联系博主
扫码或搜索:猿说python
python教程公众号
猿说python
微信公众号 扫一扫关注