线程安全,GIL全局锁

1. GIL是什么?

GIL不是Python特性
GIL是实现Python解释器(Cpython)时引入的概念,而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL。如:在JPython、PyPy中没有GIL。
GIL并不是Python的语言缺陷。

2.GIL定义

GIL,the Global Interpreter Lock,直译为“全局解释锁”

3.GIL存在原因

为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性。

(例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2执行完成,线程1仍然还在执行,这就是数据的同步性)

python为了利用多核,开始支持多线程。
CPython在执行多线程的时候并不是线程安全的,所以为了解决多线程之间数据完整性和状态同步,加一把全局解释锁,能够确保任何时候都只有一个Python线程执行。

4.GIL的弊端

GIL对计算密集型的程序会产生影响。因为计算密集型的程序,需要占用系统资源。GIL的存在,相当于始终在进行单线程运算,这样自然就慢了。

IO密集型影响不大的原因在于,IO,input/output,这两个词就表明程序的瓶颈在于输入所耗费的时间,线程大部分时间在等待,所以它们是多个一起等(多线程)还是单个等(单线程)无所谓的。

这就好比,你在公交站等公交时,你们排队等公交(单线程)还是沿着马路一字排开等(多线程)是无所谓的。公交车(即input,即输入的资源)没来,哪种方式都是瞎折腾。

5. python多线程并行执行原理

在双核cpu主机上,两个线程均为CPU密集型运算线程,这里假设每个线程单独占用一核cpu,因为GIL锁的缘故,

同一时间片就只能有一个线程获得GIL全局锁,而另一个占用cpu的线程则无法执行,继续等待,cpu时间就白白浪费掉,

也就是只有获得GIL锁的线程才能真正在cpu上运行。所以,多线程在python中只能交替执行,即使100个线程跑在100核cpu上,也只能用到1核。

6.解决方案

multiprocessing
multiprocessing是一个多进程模块,开多个进程,每个进程都带一个GIL,就相当于多线程来用了。(进程+协程)

multiprocessing的弊端
多线程与多进程一个不同点在于:
多线程是共享内存的,即这些线程共用一个内存地址。好处在于便于线程间数据通信和数据同步。
多进程,各个进程地址之间是独立的内存地址。进程间通信就需要通过队列的方式来实现。
综上所述,如果是IO密集型且对数据通信有需求,使用python 的threading模块也是可以的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 6,014评论 3 28
  • 转一篇关于Python GIL的文章。归纳一下,CPU的大规模电路设计基本已经到了物理意义的尽头,所有厂商们都开始...
    SeanCheney阅读 11,148评论 0 12
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,588评论 0 5
  • 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理...
    nine_9阅读 645评论 0 1
  • 就只看了你一眼,就已确定了永远。 ——...
    清风九里阅读 624评论 0 1