zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    vue后台管理系统项目
    javascript面试题
    webpack学习
    js全局变量收集器
    Koa2框架token验证
    require.js使用
    Koa2中使用art-template模板和静态资源托管
    Koa2POST请求参数
    H5、C3、ES6的新特性
    H5视频播放
  • 原文地址:https://www.cnblogs.com/fxc-520520/p/9322482.html
Copyright © 2011-2022 走看看