`
wwty
  • 浏览: 536682 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

python 多线程 gil

阅读更多

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

单cpu多线程:并发

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

 

在python当中,存在一个叫Global Interpreter Lock(GIL)的东西,直译就是全局解释器锁。它的作用在于让同一时刻只能有一个线程对于python对象进行操作。Python已经提供了各种机制让我们进行多线程同步,为什么又要整这个GIL呢?这是因为程序员控制的同步是对各个程序中可见的变量,而GIL同步的是解释器后台的不可见变量,比如为了进行垃圾回收而维护的引用计数。如果没有GIL,有可能出现由于线程切换导致的对同一个对象释放两次的情况。

因此,任何一个CPython线程如果要执行,就必须先获取这个GIL。后果?就是在CPython中,本质上几乎是没有线程并行的,不论你开多少个线程,同一时刻只有获取GIL的那个线程能够执行。为什么要说几乎呢,这是因为提供给python的C库中,还是有解决方案的,比如

 

这段代码是sleep的代码,在执行sleep之前,通过一个宏来释放GIL,然后在睡眠结束执行其他代码前又获取GIL。其他一下操作,比如IO,也会有类似的操作,这样就使得对于IO密集型的程序,或者是使用C库进行计算的程序,还是可以在很大程度上避开GIL来取得线程并行的效果的。但对于纯python代码的程序,GIL恐怕还是躲不过去的。

还有一个问题,就是GIL怎么释放,我们看到在python/C API中提供了宏来进行释放,那么对于普通的python语句呢?解释器会在执行一百条python代码后强制释放GIL,这就使得其它线程得以执行。

最后需要说明的,就是这个GIL的问题是解释器相关的,而不是语言相关的。也就是说它只是对于python语言解释器的一种实现,并不是语言本身的特性。事实上,GIL就是解释器的一个非常粗粒度的锁,我们完全可以采用更细粒度的锁来增加并行性,而且Gindo就写过一个patch来取消GIL,不过好像最后的结果是细粒度锁导致了单线程程序的性能下降了两倍,所以最后还是决定优先保证单线程程序的性能,继续保留GIL。但是python的其他两个分支,Jython和IronPython,却都没有GIL的问题,从而可以实现线程的并行。

 

总结:

通常加锁也有2种不同的粒度的锁:

fine-grained(所谓的细粒度), 那么程序员需要自行地加,解锁来保证线程安全

coarse-grained(所谓的粗粒度), 那么语言层面本身维护着一个全局的锁机制,用来保证线程安全

python从语言层面本身维护着一个全局的锁机制,用来保证线程安全;而java, Jython则是细粒度的。

所以也就是说,由于gil的限制,python语言本身是不能够进行并行编程的,但是可以进行并发编程;而java则没有gil意义上的限制,因此java从java7开始已经开始往并行上偏移了。

 

 

以上内容主要来自:http://software.intel.com/zh-cn/blogs/2009/11/10/python/

 

关于gil的问题,参考:http://blog.csdn.net/gvanrossum/archive/2007/09/12/1782752.aspx

 

http://www.qqread.com/other-devtool/r478310.html

  • 大小: 4.1 KB
分享到:
评论

相关推荐

    Python多线程编程

    Python多线程编程文档说明 多进程编程 一、 multiprocessing 模块 1. multiprocessing 模块提供了多进程编程的能力 它的API非常类似于 threading 模块,但是也提供了一些threading 模块不具有的能力 相比于线程,它...

    深入学习python多线程与GIL

    主要介绍了深入学习python多线程与GIL,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    线程安全及Python中的GIL原理分析

    在多核时代的到来的背景下,基于多线程来充分利用硬件的编程方法也不断发展起来, 但是一旦 牵扯到多线程,就必然会涉及到一个概念,即 线程安全, 本文就主要谈下笔者对线程安全的一些理解. 而Python为很多人所抱怨的...

    Python 多线程+多进程简单使用教程,如何在多进程开多线程

    关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生加速作用? 为什么python...

    python爬虫之多线程、多进程爬虫

    多线程对爬虫的效率提高是非凡的,当我们使用python的多线程有几点是需要我们知道的:1.Python的多线程并不如java的多线程,其差异在于当python解释器开始执行任务时,受制于GIL(全局解释所),Python的线程被限制到...

    python多线程DAY04.txt

    前情回顾 1. 信号处理 signal() * 异步通信方式 ---》 同步执行 异步执行 2. 信号量 Semaphore() acquire() 删除 release() 增加 ...7. Python线程 GIL 影响 : 同一时刻只能解释一个线程,造成

    python3爬虫中多线程的优势总结

    而且之前讲过的GIL也是对python多线程的一种限制。那么,我们为什么还要用多线程呢?当然是多线程的优势已经掩盖了它本身不足之处,所以我们来加强一下学习python多线程的信心吧~ 总结起来,使用多线程编程具有如下...

    Python threading 5 不一定有效率 GIL (多线程 教学教程tutorial)

    Python_threading_5_不一定有效率_GIL_(多线程_教学教程tutorial)

    Python 多进程、多线程效率对比

    通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 GIL 这把大锁的存在,导致执行计算密集型任务时多线程实际只能是单线程。而且由于线程之间切换的开销导致多线程往往比实际...

    python多线程DAY05.txt

    前情回顾 1. 进程线程的区别和联系 ... * 在python中应该注意GIL问题,网络延迟较高,线程并 发也是一种可行的办法 实现步骤 1. 创建套接字,绑定监听 2. 接收客户端请求,创建新的线程 3. 主线程继续接收

    二十八、Python之线程的GIL问题

     GIL(Global Interpreter Lock)并不是python的特性,而是Python解释器Cpython引入的一个概念。而python的解释器不仅仅只有Cpython,若解释器为Jpython,那么python就没有GIL。 官方的解释: In CPython, the global...

    Python GIL资料(深入理解GIL)

    Python语言的全局解释锁GIL详解,由David Beazley写的文档,分析了单核CPU、多核CPU下的Python多线程的效率,并分析线程调度,CPU竞争,以及在NEW GIL等内容,相信看完后会对Python的GIL有一个深入的理解。

    Python多进程写入同一文件的方法

    既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受GIL影响的。Python提供了一个multiprocessing的多进程库,但是多进程也有一些问题,比如,如果进程都需要写入同一个文件,那么就会出现多个...

    Python中单线程、多线程和多进程的效率对比实验实例

    python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势。而使用多...

    浅析Python多线程下的变量问题

    主要介绍了Python多线程下的变量问题,由于GIL的存在,Python的多线程编程问题一直是开发者中的热点话题,需要的朋友可以参考下

    python多线程操作实例

    一、python多线程 因为CPython的实现使用了Global Interpereter Lock(GIL),使得python中同一时刻只有一个线程在执行,从而简化了python解释器的实现,且python对象模型天然地线程安全。如果你想你的应用程序在多核...

    Python多线程编程(一):threading模块综述

    在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看...

    Python实现多线程爬虫

    最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的知识,其实网络上已经有很多...里面的多位大佬已经做出了解释,其实就是因为Python多线程用到了全局解释器锁(GIL锁),这里引用一位大佬的回答

    浅析Python中的多进程与多线程的使用

    在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行。因此,如果你是从其他语言(比如C++或Java)...

    从GIL开始重新认识Python多线程编程

    我们想要了解Python得多线程,就必须要了解GIL,GIL即全局解释锁。 举个栗子 计算机执行程序时,是需要把代码编译成机器指令再去执行的,我们现在用的编辑器,其实就是一种解释器,在我们右键运行程序时,它能够将整个文件...

Global site tag (gtag.js) - Google Analytics