GIL全局锁

Python GIL(Global Interpreter Lock)   核心意思就是,无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行,擦。。那这还叫什么多线程呀?莫如此早的下结论,听我现场讲。

首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL

来源: http://www.cnblogs.com/alex3714/articles/5230609.html

Python多线程是单cpu意义上的多线程,它和多cpu上的多线程有着本质的区别。

单cpu多线程:并发多cpu多线程:并行内部包含并发

在Python 多线程当中,存在一个叫 Global Interpreter Lock(GIL)的东西,直译就是全局解释器锁。它的作用在于让同一时刻只能有一个线程对于python对象进行操作。

1、Python已经提供了各种机制让我们进行多线程同步,为什么又要整这个GIL呢?  因为程序员控制的同步是对各个程序中可见的变量,而GIL同步的是解释器后台的不可见变量,比如为了进行垃圾回收而维护的引用计数。  如果没有GIL,有可能出现由于线程切换导致的对同一个对象释放两次的情况。

2、因此,任何一个CPython线程如果要执行,就必须先获取这个GIL。后果?  就是在CPython中,本质上几乎是没有线程并行的,不论你开多少个线程,同一时刻只有获取GIL的那个线程能够执行。为什么要说几乎呢,  这是因为提供给python的C库中,还是有解决方案的:  比如:这段代码是sleep的代码,在执行sleep之前,通过一个宏来释放GIL,然后在睡眠结束执行其他代码前又获取GIL。其他一下操作,  比如:IO,也会有类似的操作,这样就使得对于IO密集型的程序,或者是使用C库进行计算的程序,还是可以在很大程度上避开GIL来取得线程并行的效果的。但对于纯 python代码的程序,GIL恐怕还是躲不过去的。

3、还有一个问题,就是GIL怎么释放,我们看到在python/C API中提供了宏来进行释放,那么对于普通的python语句呢?  答案:解释器会在执行一百条python代码后强制释放GIL,这就使得其它线程得以执行。  最后需要说明的,就是这个GIL的问题是解释器相关的,而不是语言相关的。也就是说它只是对于python语言解释器的一种实现,并不是语言本身的特性。  事实上GIL就是解释器的一个非常粗粒度的锁,我们完全可以采用更细粒度的锁来增加并行性,而且Gindo就写过一个patch来取消 GIL,  不过好像最后的结果是细粒度锁导致了单线程程序的性能下降了两倍,所以最后还是决定优先保证单线程程序的性能,继续保留GIL。  但是python 的其他两个分支,Jython和IronPython,却都没有GIL的问题,从而可以实现线程的并行。

总结:     通常加锁也有2种不同的粒度的锁:    fine-grained(所谓的细粒度), 那么程序员需要自行地加(自己加锁),解锁来保证线程安全。    coarse-grained(所谓的粗粒度), 那么语言层面本身维护着一个全局的锁机制(GIL),用来保证线程安全    Python 多线程 从语言层面本身维护着一个全局的锁机制,用来保证线程安全;而java, Jython则是细粒度的。    所以也就是说,由于gil的限制,python语言本身是不能够进行并行编程的,但是可以进行并发编程;而java则没有gil意义上的限制,    因此java从java7开始已经开始往并行上偏移了。

来自为知笔记(Wiz)

时间: 2024-10-12 10:19:48

GIL全局锁的相关文章

[ Python - 11 ] 多线程及GIL全局锁

1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL. 2. 为什么会有GIL? 为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性 (例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2

GIL(全局解释器锁)

GIL(全局解释器锁) 我们知道多进程(mutilprocess) 和 多线程(threading)的目的是用来被多颗CPU进行访问, 提高程序的执行效率. 但是在python内部存在一种机制(GIL),在多线程 时同一时刻只允许一个线程来访问CPU. GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编译器例如GCC,INTEL C++,Visual C++等.

Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程,进程)

一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 一.paramiko 用于远程连接并执行简单的命令 使用用户名密码连接: 1 import paramiko 2 3 # 创建SSH对象 4 ssh = paramiko.SSHClient() 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set

GIL线程全局锁 协程

GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢. 见Python 最难的问题 解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能). 19 协程 知乎被问到了,呵呵哒,跪了 简单点说协程是进程和线

GIL全局解释器锁和进程池.线程池

GIL全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的,同一个进程内的所有线程都需要先抢到GIl锁,才能执行解释器代码 GIL的优缺点: 优点:保证Cpython解释器内存管理的线程安全 缺点:同一个进程内所有的线程同一时刻只能有一个执行,也就是说Cpython解释器的多线程无法实现并行,无法取得多核优势 GIL与单线程 每个进程的内存空间中都有一份python解释器的代码,所以在单线程的情况下,GIL锁没有线程争抢,只有垃圾回收机制线程会定时获取GIL权限 GIL与多线程 有了GIL

GIL全局解释器锁

1.什么是GIL全局解释器锁? GIL并不是Python的特性,而是CPython解释器的概念.Python完全可以不依赖于GIL. GIL本质是一把互斥锁,是加在CPython解释器身上的,同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.为什么会有GIL? 为了利用多核,Python开始支持多线程,而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,于是有了GIL这把超级大锁. 简单的说GIL的存在更多的是历史原因. 3.GIL的影响 GIL的存在会对多线程的效率

Python 36 GIL全局解释器锁

一:GIL全局解释器锁介绍 在CPython中,全局解释器锁(或GIL)是一个互斥锁, 它阻止多个本机线程同时执行Python字节码.译文:之所以需要这个锁, 主要是因为CPython的内存管理不是线程安全的.(然而,由于GIL的存在, 其他特性已经变得依赖于它所执行的保证.) 1. 什么是GIL全局解释器锁GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行

10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.>有名的编译器例如GCC,INTEL C++,Visual C++等.Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行

进程、线程与GIL全局解释器锁详解

进程与线程的关系: 1. 线程是最小的调度单位 2. 进程是最小的管理单元 3. 一个进程必须至少一个线程 4. 没有线程,进程也就不复存在 线程特点: 3 线程的并发是利用cpu上下文的切换(是并发,不是并行) 4 多线程执行的顺序是无序的 5 多线程共享全局变量 6 线程是继承在进程里的,没有进程就没有线程 7 GIL全局解释器锁 8 只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就 9 很合适 线程详解: import threading # --->