首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python中的GIL是个什么玩意?

所以有了下面的深入研究: 首先强调背景: 1、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。...在Python多线程下,每个线程的执行方式: 1.获取GIL 2.执行代码直到sleep或者是python虚拟机将其挂起。...3.释放GIL 可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。...在python2.x里,GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks可以看作是python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过 sys.setcheckinterval...原因是:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。

1.3K20

哪些Python操作是原子性的?

为了完成像哈希表插入这样的操作,需要执行很多条机器语言指令,我很难想象这个操作居然是原子的。 为什么会这样?...Python FAQ提供了解释以及原子操作的完整列表,但简短的答案是: Python字节码解释器只有在一个机器指令完成后,另一个机器指令没开始前,才会进行线程切换。...依靠原子性而不是使用锁是否安全? 首先,上面的链接FAQ并没有说明这种行为多大程度上被认为是Python规范的一部分,还是CPython实现的情况。...它取决于GIL,所以在GIL-less Pythons(IronPython,Jython,PyPy-TM)上可能是不安全的。 在使用GIL(PyPy)的非CPython实现上安全吗?...一个明确的备注可能也是必要的,让合作者不必产生“等等,这可能需要一个锁!”的反应。 第三,因为Python允许重载如此多的内建方法,所以有些情况下这些操作不再是原子的。

3.4K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    也许你对 Python GIL 锁的理解是 错的。

    我刚到现在这个公司时,听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说: Python 有 GIL 锁,所以它的多线程实际上是单线程,所以写多线程代码不用考虑线程冲突,不用加锁。...” 相信现在看这篇文章的同学,不少人也是这样认为的。 然而,我要告诉你的是,这句话前半句是对的,后半句是 错的。Python 的多线程确实本质上是单线程。但你依然需要考虑线程并发冲突。...它锁的是解释器而不是你的 Python 代码。它防止多线程同时执行 Python 的字节码(bytecodes),防止多线程同时访问 Python 的对象。...大家注意我这两段应用中的指针和引用计数。其中指针是 C 语言的概念,Python 没有指针;引用计数是 Python 底层的概念。...你平时写的 Python 代码,引用计数是在你调用变量的时候自动增加的,不需要你去手动加 1. 所以 GIL 锁住的东西,都是不需要你的代码直接交互的东西。

    3.3K30

    比Mojo慢68000倍,Python性能差的锅该给GIL吗?

    但由于最广为使用的 Python 实现是 CPython,因此 GIL 造成的局限性仍然在很多语境下被认为是 Python 的局限性。...那么,这个切换过程是如何发生的呢?事实上,GIL 的实现也随着 Python 的发展发生过明显的变化。...等待 GIL 的线程在等待超时后,将一个名为 gil_drop_request 原子全局变量的值设置为 1,通过这个方式来通知当前的工作线程释放 GIL。...如果想要去掉 GIL,那就必须考虑到对引用计数的并发访问,在这种情况下,无论是细粒度的锁还是对引用计数进行原子操作,都会或多或少造成一定的性能开销。...Python GIL 并不像很多人想象的那样是一个愚蠢的决策,在当时的时代背景下,它很大程度促进了 Python 的发展和生态的繁荣。

    63540

    Python 平台是独立的吗?

    Python的使用领域 Python是一种Web编程语言,用于创建大型网站或Web应用程序。...由于其广泛的库支持,它在机器学习和人工智能中很有用。 Python 平台是独立的吗? 编程语言Python是一个独立于二进制平台的。相同的 Python 代码几乎可以在任何平台或操作系统上执行。...某些模块对于特定操作系统是唯一的。在开始之前,请阅读文档。 只需采取这些预防措施即可保证流畅的跨平台体验。 Python 模块是否独立于平台? Python是一种在所有平台上运行的二进制编程语言。...11-九月-2020 Python系统依赖于吗? 假设有一个完整的Python VM实现,Python字节码是独立于平台的。...为什么 Python 是跨平台的? Python 是一种跨平台、解释型、面向对象的编程语言,适用于脚本编写、链接现有组件和快速应用程序开发 (RAD)。

    1.7K20

    ​2021-03-06:go中,公共变量是协程安全吗?赋值操作是原子的吗?为什么?

    2021-03-06:go中,公共变量是协程安全吗?赋值操作是原子的吗?为什么? 福哥答案2021-03-06: 这是面试中被问到的。实力有限,真正的答案还不知道。...我的想法是a=1是原子操作,a=b不是原子操作。实际开发中,不大可能是a=1这种情况,可以说是协程不安全。...答案1: 不是协程安全的, 赋值非原子操作, 需要加锁要么就做原子操作, 否则会引起data race。 评论如下: 题016_ 卓熊 7:39:15 Go很多操作并没有做太多处理,还是沿用了c。....github.io 16:28:09 今天的每日一题是我过的最快的一次 题078_ Tnze 10:27:04 公共变量不是协程安全的,赋值操作不是原子的 Tnze 10:27:45 这是由于线代多核...cpu中变量可能会储存在不同核心各自的cache上 Tnze 10:29:05 需要原子操作一定要用sync包 题029_ 【新手】SQL双活负载均衡集群 7:48:53 2倍就是一个估计而已,2.5倍

    1.3K10

    Python后端面试(持续更新)

    你是如何解决的?有哪些收获? STAR模型 ? 面试官一般会问:你还有什么要问我的吗?...*args, *kwargs 用来处理可变参数 *args被打包成tuple **kwargs被打包成dict Python异常机制常考题 什么是Python异常?...性能分析与优化,GIL常考题 什么是Cpython GIL GIL, Global Interpreter Lock Cpython解释器的内存管理并不是线程安全的 保护多线程情况下Python对象的访问...的多线程并不是绝对安全的 为什么有了GIL还要关注线程安全 Python中什么操作才是原子的?...一步执行到位 一个操作如果是一个字节码指令可以执行完成的就是原子的 原子的是可以保证线程安全的 使用dis操作才分析字节码 import dis ​ def update_list(l): # 原子操作

    2K11

    Python中的字典到底是有序的吗

    之前写了文章介绍python中的列表和字典,在文章中描述到了python中的列表是有序的,字典是无序的,后来有粉丝在群里提醒我,说python3.6的版本之后,字典是有序的,因此,我找了一个低版本的...python来验证一下效果: 首先,从官网下载python3.4的版本,然后编写一行代码验证一下打印字典的所有key。...查看打印出来的key的顺序: Python3.6以下版本:(以3.4版本为例) 你该不会以为只有使用keys()函数是无序的吧: 从上图可以看出,分别在cmd窗口和pycharm中打印字典的key...接下来再看下python3.6以上版本的效果:(以3.9版本为例) 从上图可以看出,在新的版本中,python针对key的存储已经变为有序,在遍历和打印的时候,会按照存储的顺序进行取值。...再补充一点:之前介绍到,在字典中,key是唯一的。这里并不是说写了不唯一的key就会报错,只是会用后面的key和value去覆盖前面的key和value。

    1.9K20

    Python自动化试题仓

    考察面向对象相关: 7、有用过类的一些魔法方法吗?用过哪些?都有什么用? 8、类的实例化方法第一个参数是什么?必须是这个单词吗?意义是什么?有没有可能第一个参数是其他的或者没有?...4、知道urllib吗?有没有更优的选择?   1).urllib是python3的库,内置了一些操作http请求的方法。...1).json是一种数据传输的格式,字典是python内置的一种数据结构。python dict 单引号双引号均可,json强制规定双引号。...1).不能,因为python内置了全局解释器锁(GIL),同一时刻只能有一个线程在运行 10、Python多线程更适合什么场景?   ...有GIL在,则某一时刻只能有一条线程运行,不会有多条线程同时修改数据的情况产生,那为什么还要加锁?   1).需要锁。因为很多操作不是原子操作。线程会在执行到100条字节码的时候切换。

    93020

    Python 的多线程与 GIL

    Python的多线程与GIL Python从0.9.8版就开始支持多线程( thread模块),1.5.1版引入了 threading高级模块,是对thread模块的封装。...换句话说,Python中支持多线程的数据结构以及GIL都是没有创建的,Python之所以有这种行为是因为大多数的Python程序都不需要多线程的支持。 Python选择了让用户激活多线程机制的策略。...) >= 0; } _Py_atomic_*是一组原子操作,封装了不同的平台的原子接口。...我们只关心两种原子操作,一种 load原子读和一种 store原子写。 _PyRuntime是一个 _PyRuntimeState对象,表示Python运行状态对象。...0x03 线程的调度 时间调度 当然,子线程是不会一直执行 t_bootstrap到释放GIL,Python中持有GIL的线程会在某个时间释放GIL。

    99410

    Python后端技术栈(一)

    **kwargs 则是将所有的关键字参数打包成一个 dict 对象。 2.4 Python 异常机制 2.4.1什么是 Python 的异常? 答:异常就是一种错误处理机制。...并且由于存在一个臭名昭著的 GIL 导致没有办法充分利用多核,这都限制了 Python 的性能。 2.5.1什么是 CPython GIL?...2.5.4 GIL 的实现 CPython 中才会有 GIL ,其他的解释器是没有的。...通俗一点就是每隔一段时间,就会尝试去释放当前线程的锁,让其他线程获取锁并去执行。 2.5.5为什么有了 GIL 之后,还要关注线程安全? Python中什么操作才是原子的?一步到位执行完的。...1.一个操作如果是一个字节码指令可以完成的就是原子的。 2.原子的是可以保证线程安全的,非原子操作不是线程安全的。 3.使用 dis 操作来分析字节码。

    5K52

    还记得当年你是如何接触Python的吗?

    绘画:琪琪 | 作者:xiaoyu 要说目前什么语言最受欢迎,我想Python肯定是其中之一了吧。Python语言以其简单的操作、强大的功能被广大爱好者追逐着。...有的朋友刚开始学Python,有的朋友正在学习的路上,也许还有些已经用了好多年了。 但不论怎样,我们都有一个起点,只是起点各自不同,还记得我们是怎么开始接触Python的吗?...excel功能也很强大,但一些情况下还是有些限制,最主要的是凸显不出自己的操作,感觉就是傻瓜操作,制作图表也不美观。...学习Python可以根据自己的需求实现完全自动化,大大提高一些工作的效率的同时,也会引来领导重视和同事羡慕的目光。 ? ? ? ? 转行学Python 因为Python转行的朋友真不在少数。...想少掉点头发 有一个非常巧的事情。Python之父是所有语言创始人中头发最浓密的,也不得不说Python确实操作简单,让人省心,头发多也不是没有道理的。 ? ? ? ? ? ?

    40200

    还记得当年你是如何接触Python的吗?

    要说目前什么语言最受欢迎,我想Python肯定是其中之一了吧。Python语言以其简单的操作、强大的功能被广大爱好者追逐着。...有的朋友刚开始学Python,有的朋友正在学习的路上,也许还有些已经用了好多年了。 但不论怎样,我们都有一个起点,只是起点各自不同,还记得我们是怎么开始接触Python的吗?...excel功能也很强大,但一些情况下还是有些限制,最主要的是凸显不出自己的操作,感觉就是傻瓜操作,制作图表也不美观。...学习Python可以根据自己的需求实现完全自动化,大大提高一些工作的效率的同时,也会引来领导重视和同事羡慕的目光。 ? ? ? ? 转行学Python 因为Python转行的朋友真不在少数。...想少掉点头发 有一个非常巧的事情。Python之父是所有语言创始人中头发最浓密的,也不得不说Python确实操作简单,让人省心,头发多也不是没有道理的。 ? ? ? ? ? ?

    39710

    【总结】最全面的Python面试知识!

    ):#屏蔽所有的元素访问         return item 类变量是不会存入实例__dict__中的,只会存在于类的__dict__中 globals/locals(可以变相操作代码) globals...会根据执行的字节码行数以及时间片释放 gil,gil 在遇到 io 的操作时候主动释放 什么是 monkey patch?...运行时判断一个对象的类型的能力,id,type,isinstance python 是值传递还是引用传递?...次/s,写的速度是81000次/s 丰富的数据类型 原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行 丰富的特性 – Redis 还支持 publish...https://www.jianshu.com/p/ea0259d109f9 为什么mysql数据库的主键使用自增的整数比较好?使用uuid可以吗?为什么?

    53820

    原来Python是这样连接远程主机的,你会吗?

    paramiko库有两种连接主机的方式, 一种是使用用户名和密码; 一种是使用秘钥连接。...,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。...有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。下面主要介绍一下Paramiko的一些相关概念。...Paramiko中的几个基础名词: Channel:是一种类Socket,一种安全的SSH传输通道; Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels...即新建立ssh连接时不需要再输入yes或no进行确认 WarningPolicy 用于记录一个未知的主机密钥的python警告。

    2.1K40

    这大概是你见过最全面的 Python 重点了

    ):#屏蔽所有的元素访问 return item 类变量是不会存入实例__dict__中的,只会存在于类的__dict__中 globals/locals(可以变相操作代码) globals...会根据执行的字节码行数以及时间片释放gil,gil在遇到io的操作时候主动释放 什么是monkey patch?...运行时判断一个对象的类型的能力,id,type,isinstance python是值传递还是引用传递?...数据结构简单 自己构建了VM机制,减少调用系统函数的时间 优势 性能高 – Redis能读的速度是110000次/s,写的速度是81000次/s 丰富的数据类型 原子 – Redis的所有操作都是原子性的...,同时Redis还支持对几个操作全并后的原子性执行 丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性 什么是redis事务?

    71720

    最全面的Python重点知识汇总,建议收藏!

    ):#屏蔽所有的元素访问 return item 类变量是不会存入实例__dict__中的,只会存在于类的__dict__中 globals/locals(可以变相操作代码) globals...会根据执行的字节码行数以及时间片释放gil,gil在遇到io的操作时候主动释放 什么是monkey patch?...运行时判断一个对象的类型的能力,id,type,isinstance python是值传递还是引用传递?...数据结构简单 自己构建了VM机制,减少调用系统函数的时间 优势 性能高 – Redis能读的速度是110000次/s,写的速度是81000次/s 丰富的数据类型 原子 – Redis的所有操作都是原子性的...,同时Redis还支持对几个操作全并后的原子性执行 丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性 什么是redis事务?

    99820

    Python中的==与is关键字,是一样的吗

    标签:Python 双等号==运算符和is关键字是Python中比较对象的常用语句,本文将通过几个例子了解它们之间的区别。...双等号==运算符 当赋值给被比较对象的值相等时,双等号==运算符返回True。==运算符在比较对象时不匹配两个对象的内存位置,因此,即使两个对象的内存位置不同但值相同,双等号运算符也将返回True。...图2 is关键字 is关键字通过匹配两个或多个对象的内存位置来比较它们的身份。即使两个对象包含相同的项,如果对象不指向相同的内存位置,is关键字也将返回False。...通过将对象传递给id()方法,可以检查对象的内存位置。下面的脚本打印car1和car3列表的内存位置。 图4 图4中的输出显示,列表对象的内存位置确实不同。...图6 小结 双等号==运算符匹配相等,并比较两个对象的值,而不考虑它们的内存位置。而is关键字通过比较对象的内存位置来匹配对象的标识。 注:本文学习整理自wellsr.com,供有兴趣的朋友参考。

    1K30
    领券