python 之 GIL
一,
1.什么是GIL(这是Cpython解释器)
GIL本质就是一把互斥锁,那既然是互斥锁,原理都一样,都是让多个并发线程同一时间只有一个执行。
即:有了GIL的存在,同一进程内的多个线程同一时刻只能有一个再运行,意味着在Cpython中,
一个进程下的多个线程无法实现并行-----》意味着无法使用多核优势(比如四个线程同一时刻只能用一个cpu,如果有4 个cpu的话)
但并不影响并发的实现。
GIL可以被比喻成执行权限,同一进程下的所有线程,要想执行都需要先抢执行权限。
2.为何要有GIL?
因为Cpython 解释器自带垃圾回收机制不是线程安全的。
为什么不是线程安全的?
如果线程并行时候,在开辟内存空间时,尚未来得及把值绑定给变量名时候,可能刚好自带的垃圾回收机制运行,被 回 收了,那么值就找不到引用的变量名了。就会不安全。
3.如何用?
GIL vs 自定义互斥锁
GIL相当于执行权限,会在任务无法执行的情况下,被强行释放。
自定义互斥锁即便是无法执行,也不会自动释放。
4.有两种并发解决方案:
多进程:用于 计算密集型
多线程:用于IO密集型
同一进程下的多个线程,先抢GIL锁,才运行python代码,再抢里面的mutex.acquire()锁,此时没有竞争者,只有自己拿这个锁,当遇到IO时,操作系统强行把GIL释放掉,但mutex.acquire()没有释放,另一个线程要等。这时需要导尿等还出cpu,让另一个人抢GIL,当自己睡醒后,再接着之前的状态进行运行,运行完再释放mutex.release