zoukankan      html  css  js  c++  java
  • 问:为什么python中有了全局解释器锁GIL,还要有互斥锁?

      首先我们在进行对比之前,我们要知道什么是全局解释器锁,和什么是互斥锁,他们分别是用来做什么的才能解决这个问题。

      

      首先介绍全局解释解释器锁GIL,Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。从宏观微观上来说,GIL是宏观的操作。比如在一个4核的环境下,只有一个核是运行着线程,而其他三个核是空的。GIL是线程锁,针对线程,而不是进程。然而这些规则是Cpython给的,像Jpython就没有这个机制。

      其中,在多线程的情况下,python虚拟机按以下方式执行:

      1. 设置GIL
      2. 切换到一个线程去运行
      3. 运行:
          a. 指定数量的字节码指令,或者
          b. 线程主动让出控制(可以调用time.sleep(0))
      4. 把线程设置为睡眠状态
      5. 解锁GIL
      6. 再次重复以上所有步骤
     
     
      接下来是互斥锁:个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。互斥锁体现的就是一个同步的机制,即该线程释放资源就是一个条件,条件完成,才能执行下一步操作。是微观的操作。
      好像,这样就能说明两者的区别了。。。后续补充--
  • 相关阅读:
    HomeFragment 嵌套关系
    mysql 变量定义 sql查询
    MSSQLSERVER执行计划详解
    数据传输常用的三种格式:XML、JSON(JSONP)、YAML
    数据传输常用的三种格式:XML、JSON(JSONP)、YAML
    C-链表
    C-链表
    JVM+微服务+多线程+锁+高并发性能
    JVM+微服务+多线程+锁+高并发性能
    vba实现字母全部转小写
  • 原文地址:https://www.cnblogs.com/swearBM/p/9244011.html
Copyright © 2011-2022 走看看