zoukankan      html  css  js  c++  java
  • GIL(全局解释器锁)

    引入

      现在绝大部分的Python都是CPython解释器(但不是必须使用CPython解释器),而CPython的一个特性就是有GIL,作用保证解释器级别的代码在运行时不被其他的线程进行修改,即加锁处理。

      造成的影响是:在同一个时刻内一个进程内的多个线程只能有一个线程被运行。但是要注意:GIL不是Python的特性,而是Python所使用的解释器的特性。

    详细介绍:

      GIL的本质就是一把互斥锁,既然是互斥锁,它们的本质都是将并发运行变成串行运行,使在同一时刻内,共享数据只能被一个进行内的一个任务(线程)修改,从而保证数据的安全。

      可以肯定的是,保证不同级别的数据的安全,就应该加不同的锁。

      在CPython中有两种级别的数据:

        解释器级别数据:解释器代码和线程传入的代码所构成的数据集。

        用户自定义数据:用户在程序中自定义的数据集。

      所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码,而解释器代码是所有线程的共享数据,也就是说任何的线程都可以访问到解释器代码,但是能访问到不代表可以获取解释器代码的执行权限。因此,线程在运行时,首先要做的就是获取解释器的执行权限。总有一个线程先得到解释器的执行权限,那么其它的线程就要处于等待状态。线程在获取到执行权限后,首先为解释器级别数据(解释器代码+线程代码)进行加锁,该锁便是GIL锁,防止其他的线程在该线程没有解锁之前对解释器的使用,只有在该线程释放掉解释器的执行权限之后,其他的线程才能进行争夺。

      GIL的作用对象是所有的线程(同一进程的线程+非同一进程的线程),这把锁保证的只是解释器级别数据的安全性,但是不能保证用户数据级别的数据的安全性,解决这一问题,需要的就是另一把锁:互斥锁。互斥锁针对的是同一进程之间的共享数据,再某一线程对其修改时,不能被其它的线程修改,保证了数据的安全性。

    GIL的出现对程序采用多线程或多进程的影响:

      结果:

        计算型---------------------------->多核--------------------------------->采用多进程

        IO型------------------------------->多核--------------------------------->采用多线程

  • 相关阅读:
    【翻译】Flink Table Api & SQL —Streaming 概念 —— 时态表
    【翻译】Flink Table Api & SQL —Streaming 概念 ——在持续查询中 Join
    【翻译】Flink Table Api & SQL —Streaming 概念 ——时间属性
    【翻译】Flink Table Api & SQL —Streaming 概念 ——动态表
    【翻译】Flink Table Api & SQL ——Streaming 概念
    Kubernetes控制器之Deployment
    Kubernetes中nodeport,port,targetport对比
    Kubernetes控制器之ReplicaSet
    Kubernetes之Pods
    Kubernetes之使用ConfigMap配置Pod
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/7989291.html
Copyright © 2011-2022 走看看