美文网首页
线程安全,GIL全局锁

线程安全,GIL全局锁

作者: 一介书生_1861 | 来源:发表于2019-09-26 23:42 被阅读0次

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模块也是可以的。

相关文章

  • 线程安全,GIL全局锁

    1. GIL是什么? GIL不是Python特性GIL是实现Python解释器(Cpython)时引入的概念,而C...

  • Python 经验 - 多线程与多进程

    多线程 GIL GIL(Global Interpreter Lock)即全局解释器锁。 在Python中一个线程...

  • GIL锁

    Gil全局解释锁延伸扩展 GIL:全局解释器锁。当我们使用多线程的时候,每一个进程中只有一个GIL锁,那么这多个线...

  • python之多线程与多进程入门

    python之多线程与多进程 关键词: GIL锁,IO繁忙,线程安全,线程同步,进程池,进程通信,队列 GIL锁;...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

  • Python day28_GIL 深拷贝浅拷贝

    GIL(全局解释器锁) GIL面试题如下 描述Python GIL的概念, 以及它对python多线程的影响?编写...

  • GIL线程全局锁

    线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的...

  • python多线程

    python基础之多线程锁机制 GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析...

  • python 多线程和多进程相关概念

    python默认解释器是Cpython,内存管理不是线程安全的,所以Cpython有一个东西叫GIL,全局解释器锁...

  • Python GIL

    一、Python GIL ==GIL== :全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有...

网友评论

      本文标题:线程安全,GIL全局锁

      本文链接:https://www.haomeiwen.com/subject/cqfouctx.html