全局解释器锁或GIL是一个互斥锁,它阻止多个本机线程同时执行Python字节码。这个锁是必需的,主要是因为CPython的内存管理不是线程安全的。(然而,由于GIL的存在,其他的特性已经发展到依赖于它所执行的保证。)
在CPython的环境下,即使在多核的情况下,同一个进程启动多个线程,只能执行一个线程。 无法利用多核的一个优势 。
GIL的优点:
保证Cpython解释器内存管理的线程安全
GIL的缺点:
同一进程内所有的线程同一时刻只能有一个执行。
也就是说Cpython解释器的多线程无法实现并行。
为什么需要GIL :
python中一切都是对象,Cpython中对象的回收,是通过对象的引用计数来判断,当对象的引用计数为0时,就会进行垃圾回收,自动释放内存。
但是如果多线程的情况,引用计数就变成了一个共享的变量 Cpython是当下最流行的Python的解释器,使用引用计数来管理内存,在Python中,一切都是对象,引用计数就是指向对象的指针数,当这个数字变成0,则会进行垃圾回收,自动释放内存。但是问题是Cpython是线程不安全的。
考虑下如果有两个线程A和B同时引用一个对象obj,这个时候obj的引用计数为2;A打算撤销对obj的引用,完成第一步时引用计数减去1时,这时发生了线程切换,A挂起等待,还没执行销毁对象操作。
B进入运行状态,这个时候B也对obj撤销引用,并完成引用计数减1,销毁对象,这个时候obj的引用数为0,释放内存。如果此时A重新唤醒,要继续销毁对象,可是这个时候已经没有对象了。所以为了保证不出现数据污染,才引入GIL。
CPU密集型:在高CPU利用率的代码中,此时这种同一时刻只能有一个线程访问CPU机制会响应效率,如高计算类的代码中。如真遇到这种情况,可以用多进程,不用多线程处理
IO密集型:处理文件、处理web请求、爬取网页、设备文件、读写数据、send、recv,我们遇到的基本都是IO的,很少遇到计算类的东西
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
气体绝缘输电线路(gas-insulated transmission line,GIL)具有传输容量大、运行可靠性高、环境友好的特点,国内外尚无特高压GIL成熟产品和应用案例,亟需开展其关键技术
发表于 12-15 14:39
•1次下载
GIL : Gas Insulated transmission Line 气体绝缘输电线路或 CGIT: Compressed Gas Insulated Transmission line
发表于 09-10 08:00
•44次下载
哪些因素影响智能锁价格?-坤坤智能锁如今,市场上的智能锁价格从几百到几千的都有,为什么相差这么大呢?哪些因素影响智能锁价格
发表于 11-21 10:04
•452次阅读
为什么智能锁的价格比普通机械锁高?-诺托智能锁如今,智能锁越来越普及化,很多家庭都选择智能锁,但是,为什么智能
发表于 12-03 11:44
•386次阅读
如今,智能锁已经成为家居必备的产品,是智能家居必不可少的代表性产物。然而,在智能锁市场上不要单纯地追赶智能门锁潮流,而是细心了解、寻找真正适合自己的智能锁产品。那么,关于智能锁
发表于 03-30 15:52
•389次阅读
智能锁区别于传统的机械锁,传统的机械门锁是不需要电池进行驱动,可以永久使用,不用担心电的问题,而智能门锁因为是电子控制的,很多功能都需要电的支撑,所以
发表于 04-07 14:30
•9298次阅读
指纹门禁锁和指纹锁怎么区分?指纹门禁锁和指纹门锁有何区别?在很多时候,普通消费者容易将指纹门禁锁和指纹门锁的定义混淆,其实二者是有区别的,适用范围和需求也不一样,在选购产品时,
发表于 06-11 14:43
•4741次阅读
随着科技的发展,很多需要上锁的东西都变成了使用指纹锁。指纹锁的好处在于它方便,而且不容易被打开。每个人的指纹都是独一无二的,那么打开指纹锁的钥匙也就是独一无二的了。现在很多人都会在手机
发表于 06-15 17:35
•5242次阅读
7月29日,“万里长江第一廊”——世界首条特高压GIL管廊完成工程投运以来首次全面“体检”,有力保障了今夏用电高峰期华东地区能源供应安全,更好地促进长三角地区一体化发展。
发表于 07-31 11:03
•911次阅读
就目前的智能锁产品选择多样,对一般家庭来说,在全自动智能锁和半自动智能锁之间又该如何选择呢?其工作原理是什么?两者之间又各有什么优势和区别呢
发表于 08-20 16:19
•8842次阅读
我是一个Python线程,我的工作就是解释执行程序员编写的Python代码。 之所以说是解释执行,是因为Python是高级语言,CPU那家伙不认识Python代码,需要运行的时候动态翻译成CPU指令
发表于 03-22 10:01
•1341次阅读
这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题。 Redis 分布式锁的话题,很多文章已经写烂了,我为什么还要写这篇文章呢? 因为我发现网上 99% 的文章,并没有把这个问题真正
发表于 08-10 18:06
•5584次阅读
如果该提案通过,意味着默认情况下 CPython 不会删除或关闭 GIL,也不会让用户有选择地启用 / 删除 GIL。因为--without-gil是一个编译时标志,可以在从源代码构建 Python
发表于 01-13 15:31
•444次阅读
自旋锁 自旋锁与互斥锁很相似,在访问共享资源之前对自旋锁进行上锁,在访问完成后释放自旋锁(解锁);事实上,从实现方式上来说,互斥
发表于 07-21 11:19
•9424次阅读
保护共享资源不被多个线程同时访问。它的实现原理主要包括以下几个方面: 1. 锁的初始化 互斥锁在创建时需要进行初始化,通常包括设置锁的状态为“未锁定”。在某些实现中,还需要初始化
发表于 07-10 10:07
•412次阅读
评论