1、什么是GIL?

GIL本质上是互斥锁,可以将并发运行变为串行,以此来控制同一时间内共享数据只能被一个任务修改,保证时间安全

2、GIL应用场景

使用原因:Cpython解释器自带垃圾回收机制不是线程安全的

在一个python 进程内,包含了许多线程(主线程,解释器级别线程);主线程开启了许多其他线程如(线程1,线程2,线程3),解释器级别线程如垃圾回收线程,因为他们在一个进程内所以数据是共享的,如果涉及到对共同数据100的修改,线程1执行是x=100,垃圾回收执行的是回收数据100的操作,要解决这种冲突,进行加锁处理,谁拿到权限谁先执行,保证python解释器同一时间只能执行一个任务代码

3、GIL与LOCK对比

(1)GIL保护的是解释器级的数据,LOCK保护用户自己的数据,需要自定义互斥锁;

(2)GIL相当于执行权限,会在任务无法执行的情况下强行释放,自定义互斥锁即使任务无法执行也不会释放

线程py1执行流程:获取公共数据,先拿到了GIL LOCK,启动python解释器,(python中的线程即操作系统的原生线程)调用操作系统,分配cpu给线程py1;遇到IO操作,释放GIL LOCK;再拿到锁时,重复执行之前的步骤,直到结束更新共享数据池;线程Py2要操作数据申请到了GIL LOCK,启动python解释器,让操作系统分配cpu给py2,执行完后,更新共享数据池,并释放GIL LOCK;

全局解释器锁 GIL的更多相关文章

  1. python 线程队列、线程池、全局解释器锁GIL

    一.线程队列 队列特性:取一个值少一个,只能取一次,没有值的时候会阻塞,队列满了,也会阻塞 queue队列 :使用import queue,用法与进程Queue一样 queue is especial ...

  2. 全局解释器锁GIL

    我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: from threading import Thread import os def func(args): global n n ...

  3. 全局解释器锁GIL & 线程锁

    1.GIL锁(Global Interpreter Lock) Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行 ...

  4. python 什么是全局解释器锁GIL

    什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在 ...

  5. 并发编程——全局解释器锁GIL

    1.全局解释器锁GIL GIL其实就是一把互斥锁(牺牲了效率但是保证了数据的安全). 线程是执行单位,但是不能直接运行,需要先拿到python解释器解释之后才能被cpu执行 同一时刻同一个进程内多个线 ...

  6. 21.线程,全局解释器锁(GIL)

    import time from threading import Thread from multiprocessing import Process #计数的方式消耗系统资源 def two_hu ...

  7. Python全局解释器锁 -- GIL

    首先强调背景: 1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能 ...

  8. python 多线程编程之使用进程和全局解释器锁GIL

    本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...

  9. Python核心技术与实战——十九|一起看看Python全局解释器锁GIL

    我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...

  10. Python如何规避全局解释器锁(GIL)带来的限制

    编程语言分类概念介绍(编译型语言.解释型语言.静态类型语言.动态类型语言概念与区别) https://www.cnblogs.com/zhoug2020/p/5972262.html Python解释 ...

随机推荐

  1. 静态属性property

    静态属性property(是通过对象去使用) property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 . 通过@property修饰过的函数属性,调用的时候无需在加() cla ...

  2. python---使用字典来实现链接表图

    最后一章,坚持!!! # coding = utf-8 class Vertex: def __init__(self, key): self.id = key self.connected_to = ...

  3. python---冒泡和短冒泡排序

    冒泡是最费时的排序,但可以自定义更多步骤. 短冒泡确实可以加快性能. # coding = utf-8 # ========冒泡排序======== def bubble_sort(a_list): ...

  4. 一脸懵逼学习Hive的安装(将sql语句翻译成MapReduce程序的一个工具)

    Hive只在一个节点上安装即可: 1.上传tar包:这个上传就不贴图了,贴一下上传后的,看一下虚拟机吧: 2.解压操作: [root@slaver3 hadoop]# tar -zxvf hive-0 ...

  5. PyTorch中的backward [转]

    转自:https://sherlockliao.github.io/2017/07/10/backward/ backward只能被应用在一个标量上,也就是一个一维tensor,或者传入跟变量相关的梯 ...

  6. CentOS7下Django环境的搭建安装python3.6.5,virtualenv django1.11.14

    1.帖子1https://blog.csdn.net/a249900679/article/details/51527200 2.virtualenv https://www.cnblogs.com/ ...

  7. 利用Jmeter做接口测试的时候,如何提取头部的JSESSIONID然后传递到下一个请求,继续完成当前用户的请求。

    其实,关于这个问题有三种种解决方法: 1)从响应数据里面提取JSESSIONID,点击链接可以查看https://www.cnblogs.com/liulinghua90/p/5320290.html ...

  8. Git branch 出现"HEAD detached at head xxxxx"

    Git branch 出现"HEAD detached at head xxxxx" git branch <your-branch-name> xxxxx      ...

  9. POJ 1470 Closest Common Ancestors (模板题)(Tarjan离线)【LCA】

    <题目链接> 题目大意:给你一棵树,然后进行q次询问,然后要你统计这q次询问中指定的两个节点最近公共祖先出现的次数. 解题分析:LCA模板题,下面用的是离线Tarjan来解决.并且为了代码 ...

  10. SQL-内连接、外连接(左、右)、交叉连接

    本文测试基于以下两个表,student(左) \ teacher(右),使用数据库MariaDB,图形化界面HeidiSQL. 连接查询的概念:根据两个表或多个表的列之间的关系,从这些表中查询数据,即 ...