前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >45.python GIL锁

45.python GIL锁

作者头像
猿说编程[Python和C]
修改2021-04-19 14:52:59
5210
修改2021-04-19 14:52:59
举报
文章被收录于专栏:猿说编程猿说编程

python中除了 线程互斥锁Lock 还有 GIL锁,GIL锁全称:Global Interpreter Lock,任何Python  线程threading 执行前,必须先获得GIL锁才能执行,当线程获取到GIL锁之后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。

GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核 – 不能有效的利用计算机资源,效率低下,并非真正意义上的多线程;而真正的多线程执行时,如果有100个线程跑在100核CPU上,那么就能用到100个核 – 充分利用计算机资源,高效率(C语言/Java等等都是如此….)。

压压惊
压压惊

一.并行和并发

python 线程threading与进程Process区别 的文章中有介绍关于并行和并发的简单讲解,在讲解GIL 之前,有必要在补充一下关于并行和并发的知识;

并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。

并行
并行

举个栗子:老王想打麻将,一缺三,分别同时给张三/李四/王五三位基友打电话,半个小时内集合打麻将,张三李四王五接到电话后,立即出发赶往老王家,张三李四王五的行为就属于并行;累计耗时:0.5小时;

并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。大家可以参考下图的实物图就行理解:

并发
并发

举个栗子:老王想打麻将,一缺三,先给张三打电话,半小时内来我家集合打麻将,张三接到电话后立即赶往老王家;张三到了之后老王立即给李四打电话,半小时内来我家集合打麻将,李四接到电话后立即赶往老王家;李四到了之后老王立即给王五打电话,半小时内来我家集合打麻将,王五接到电话后立即赶往老王家;张三李四王五的行为就属于并发;累计耗时:1.5小时;

装

并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。

二.GIL锁

GIL – 也称锁全局解释器锁(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。

案例一:单核多线程

单核多线程
单核多线程

案例二:单核多线程

双核多线程
双核多线程

案例三:双核多线程

双核多进程
双核多进程

由上所述:由于GIL锁的存在,多线程并不会充分调用两个CPU,而是会像在一个CPU上充分运转,而多进程则是会完全调用两个CPU,同时执行;

很多小伙伴可能会疑惑:python 线程存在GIL 锁问题,难道进程Process就不存在这个问题嘛?你需要明白:线程共享资源,进程会复制一份资源,进程与进程之间互不影响!

三.如何解决GIL锁问题

1.使用多进程完成多线程的任务

2.在使用多线程可以使用c语言去实现

猜你喜欢:

1.python线程threading

2.python进程Process

3.python线程互斥锁Lock

4.python进程互斥锁Lock

5.python线程threading与进程Process区别

转载请注明猿说Python » python GIL锁

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.并行和并发
  • 二.GIL锁
    • 案例一:单核多线程
      • 案例二:单核多线程
        • 案例三:双核多线程
        • 三.如何解决GIL锁问题
          • 猜你喜欢:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档