Python GIL-------全局解释器锁

按照惯例先上官方文档:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. 

This lock is necessary mainly because CPython’s memory management is not thread-safe.

鉴于本人英语水平一般,百度翻译如下:

在cpython中,全局解释器锁(gil)是一个互斥体,它可以防止多个本机线程同时执行python字节码。
这个锁是必要的,主要是因为cpython的内存管理不是线程安全的。
好了,开始进入正题:

GIL:全局解释器锁。

首先从官方文档看出,

第一点:这个锁是在cpython解释器中的,所以不要想当然的以为是python语言本身的缺陷。

第二点:互斥锁,和大家了解的其他锁一样,只不过这个锁是解释器级别的,防止多个线程在同一时间点执行多个线程,所以从这可以看出,不过cpu是否是多核,也只能在同一个时间点执行一个线程。所以多线程并不能利用cpu多核的优势,并不能实现真正意义上的并行执行,只能做到并发(并行简单说,在同一时间可以做到多个线程或者进程执行,真正的同时执行。并发:只是任务快速切换,看似任务在同时执行,之前线程,进程,协程有介绍)

第三点:原因,cptyhon的内存管理不是线程安全的。就是大家都去访问会造成线程不安全,数据内存寄存器都是共享的,那就会造成数据紊乱。还有就是解释器级别的线程也会开启共同占用这部分资源

那python多线程还有个毛线用(毛衣也打不成了)?

这就得看你这多线程用在了那里(具体原因可以参考进程,线程,协程那块):

IO密集型:如果都是IO操作比较多,那多线程就有了用武之地。

计算密集型:几乎99%都需要cpu的参与,那就呵呵了。说实话还不如单线程快,单线程少了切换和备份还原现场时间

那多核多线程呢?

多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低

到此为止基本上前因后果都说完了那,如何利用多核呢?

1.最简单的换python解释器,因为根源出在解释器

2.不想换解释器,默认安装都是cpython啊。那就多进程

原因是:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。但是注意,进程的切换可是比线程更加耗费资源的,所以不能像多线程那样搞好多个来替代原来的多线程。所以尽量在多核cpu上分配进程吧

排版比较垃圾将就着看吧

 

 

猜你喜欢

转载自www.cnblogs.com/gtsnow/p/10944515.html