python GIL(全局解释器锁)

1.Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL,其他的解释器如Jpython就没有此问题。
2.GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。也就是在处理器是多核的情况下,即使使用了多个线程,也这多个线程由于GIL的限制也不能并行执行,同一时刻只有一个线程在运行。在启动两个线程运行的情况下,每个CPU的使用率只有50%。
3.线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100。
4.Python使用多进程是可以利用多核的CPU资源的。
5.多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁,如发送两个请求,每个请求响应需要5分钟,如果是单线程,那么按顺序发送接收共需10分钟,而多线程可以先把两个请求发送出去,再等待5分钟差不多能一起接收回来,节约了一半的时间。
6.计算密集型用多进程,如不停的计算1到100万的和(没有等待时间);IO密集型用多线程,如读取文件(有输入输出,有等待时间)。

并行和并发的区别:
并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。大家可以参考下图的实物图就行理解:


并行和并发

并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。

接下来我们来看看进程和线程之间的区别:

两个多线程同时执行死循环,查看单个CPU的使用率:


两个多线程,单个CPU

两个多线程同时执行死循环,查看两个CPU的使用率:


两个多线程,两个CPU

两个多进程同时执行死循环,查看两个CPU使用率:


两个多进程,两个CPU

也就是说,多线程并不会充分调用两个CPU,而是会像在一个CPU上充分运转,而多进程则是会完全调用两个CPU,同时执行;

Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu,解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁, 于是有了GIL这把超级大锁。因为cpython解析只允许拥有GIL全局解析器锁才能运行程序,这样就保证了保证同一个时刻只允许一个线程可以使用cpu。由于大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。

参考:https://blog.csdn.net/weixin_41594007/article/details/79485847

你可能感兴趣的:(python GIL(全局解释器锁))