按照惯例先上官方文档:
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上分配进程吧
排版比较垃圾将就着看吧