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

原文地址:https://www.cnblogs.com/fxc-520520/p/9322482.html