• python 中的GIL (全局解释器锁)详解


    1.GIL是什么?
    GIL全称Global Interpreter Lock,即全局解释器锁。 作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行。
    GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。python 与 python解释器是两个概念,切不可混为一谈,也就是说,GIL只存在于使用C语言编写的解释器CPython中。
    通俗地说,就是如果你不用Python官方推荐的CPython解释器,而使用其他语言编写的Python解释器(比如  JPython: 运行在Java上的解释器,直接把python代码编译成Java字节码执行 ),就不会有GIL问题。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
     
    2.GIL有什么作用?
    为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性。  python为了利用多核,开始支持多线程,但线程是非独立的,所以同一进程里线程是数据共享,当各个线程访问数据资源时会出现竞状态,即数据可能会同时被多个线程占用,造成数据混乱,这就是线程的不安全。而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。GIL能限制多线程同时执行,保证同一时间内只有一个线程在执行。
     
    3.GIL有什么影响?
    GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。
     
    4.如何避免GIL带来的影响?
    方法一:用进程+协程 代替 多线程的方式
    在多进程中,由于每个进程都是独立的存在,所以每个进程内的线程都拥有独立的GIL锁,互不影响。但是,由于进程之间是独立的存在,所以进程间通信就需要通过队列的方式来实现。
     
    方法二:更换解释器
    像JPython和IronPython这样的解析器由于实现语言的特性,他们不需要GIL的帮助。然而由于用了Java/C#用于解析器实现,他们也失去了利用社区众多C语言模块有用特性的机会。所以这些解析器也因此一直都比较小众。
  • 相关阅读:
    【水滴石穿】RNNewsGo
    【水滴石穿】FirstReactNativeProject
    EF4.0和EF5.0增删改查的写法区别及执行Sql的方法
    SQL 2005中char、nchar、varchar、ntext and nvarchar(max)的区别
    七秘诀工作效率与薪水翻番-转
    NopCommerce架构分析(转载)
    转:一个基于互联网医疗的创业公司,三年是一个收获
    如何学习开源系统有感(一)
    C#的CLR组成和运转介绍
    jquery 选择器,模糊匹配
  • 原文地址:https://www.cnblogs.com/new-rain/p/9974291.html
Copyright © 2020-2023  润新知