Python GIL 锁 - Python零基础入门教程
目录
- 一.并行和并发
- 二.GIL 锁
- 案例一:单核多线程
- 案例二:单核多线程
- 案例三:双核多线程
- 三.如何解决 GIL 锁问题
- 四.猜你喜欢
零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门
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 语言去实现
四.猜你喜欢
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
- Python 不定长参数 *argc/**kargcs
- Python 匿名函数 lambda
- Python return 逻辑判断表达式
- Python is 和 == 区别
- Python 可变数据类型和不可变数据类型
- Python 浅拷贝和深拷贝
- Python 异常处理
- Python 线程创建和传参
- Python 线程互斥锁 Lock
- Python 线程时间 Event
- Python 线程条件变量 Condition
- Python 线程定时器 Timer
- Python 线程信号量 Semaphore
- Python 线程障碍对象 Barrier
- Python 线程队列 Queue – FIFO
- Python 线程队列 LifoQueue – LIFO
- Python 线程优先队列 PriorityQueue
- Python 线程池 ThreadPoolExecutor(一)
- Python 线程池 ThreadPoolExecutor(二)
- Python 进程 Process 模块
- Python 进程 Process 与线程 threading 区别
- Python 进程间通信 Queue / Pipe
未经允许不得转载:猿说编程 » Python GIL 锁
Python GIL 锁 - Python零基础入门教程相关推荐
- Python return逻辑判断表达式 - 零基础入门教程
目录 一.return 逻辑判断表达式 and 二.return 逻辑判断表达式 or 三.return 逻辑判断表达式 and 和 or 配合使用 四.return 逻辑判断表达式重点总结 五.猜你 ...
- python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)
一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...
- 视频教程-Python零基础入门教程-Python
Python零基础入门教程 从2012年从事互联网至今有7年软件编程经验,曾任职国内北京互联网公司,中南林业大学授课Python 现任逻辑教育Python课程负责人,精通Python语言,精通人工智能 ...
- Python零基础入门教程( 快速入门)
前言 学无止境,无止境学. 今天要给大家分享的是<Python零基础入门教程01 快速入门>,这是一个系列的教程,从零基础到项目实战.在本教程中,我会给大家介绍Python入门的一些基础知 ...
- Python 3.X 完全零基础入门精讲 全套视频教程
简介 零基础小白快速学程序员大爱语言――Python,易学易用易就业!!! 目标人群:熟悉电脑基本操作,编程零基础或已具备Python或其它编程语言的人群. 课程目标:绝对零基础Python3.x 入 ...
- python是什么软件-零基础入门Python怎么学习?老男孩python用什么软件
在培训学习Python时,怎么才能学好Python?随着Python技术的发展,越来越多的人开始学习Python编程语言,那么零基础入门Python该怎么学习? 1.要养成良好的代码编写习惯,注重细节 ...
- 视频教程-ARDUINO零基础入门教程【代码编程篇】-Arduino
ARDUINO零基础入门教程[代码编程篇] 精通各种单片机编程,有十年以上ARDUINO,51单片机/STM32/PIC/AVR编程,硬件设计,绘图,编程经验.熟悉各种常用传感器使用和物联网通讯 赵勇 ...
- SEO零基础入门教程(外链的发布和软文编写)
seo的作用是众所周知的,对网站进行seo优化,可以给网站带来大量的搜索引擎流量.但是想要做好网站优化也有难度,尤其是对于seo新手来说,因为缺乏理论和实战,所以seo新手需要多加练习.那么具体seo ...
- 九宫怎么排列和使用_剪映零基础入门教程第三十七篇:一学就会系列之九宫格小程序配音...
很多玩儿抖音的朋友都看过九宫格视频,但是并不是每个玩抖音的人都会制作这个九宫格视频,实际这个需要借助小工具来帮忙,而常用抖音的朋友们会对剪映更加熟悉一些,且九宫格视频在剪映内的制作方式则比较简单.那么 ...
- 计算机pscs6教程,photoshop CS6零基础入门教程
<photoshop CS6零基础入门教程>针对零基础学员开设,以教案和实际操作演示相结合的方式,详细地介绍adobe photoshop cs6的各项工具和命令.由浅入深.循序渐进地全面 ...
最新文章
- PHPer常见的面试题总结
- java启动 守护进程_java守护进程启动和关闭脚本
- python打开是什么颜色-python实现简单颜色识别程序
- LeetCode 编程 二
- 利用Chrome开发者工具memory comparison分析一个时间段内的JavaScript代码内存占用率
- 【SQL基础】T-SQL函数类型——元数据函数
- undertow 怎么创建线程_为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow
- 在Windows上使用MSVC编译QuaZip
- AutoCAD 2022 Mac中文版发布 最好的Mac CAD软件
- 程序员是否要考PMP认证?看这篇就够了
- 2022-2027年中国非人寿保险市场竞争态势及行业投资前景预测报告
- 关于发布app报90096错误,iPhone5启动图片报错
- godot mysql_go godotenv配置环境变量
- pgpool添加用户
- ffmpeg安装遇错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
- 教老婆学java系列之奇妙的数据结构三
- 【白兔兔】TiKZ画浮动汇率制度下的财政政策图
- 中文路径刻录Linux总是损坏,linux下刻录光盘所发生的问题及解决办法
- Python机器学习及实践——简介篇3(逻辑回归)
- Go获取n天前或后的日期、日期转秒时间戳、计算两个日期之间的天数差
热门文章
- MYSQL深潜 - 剖析Performance Schema内存管理
- 配置MaxCompute任务消费监控告警,避免资源过度消费
- TOP互联网公司都在用,为什么SRE比传统运维更抢手?
- 来了!云栖大会都能看到什么?
- 阿里云与A站在一起后,悄悄干了件大事
- 阿里云TSDB在大数据集群监控中的方案与实战
- 天啦噜!在家和爱豆玩quot;剪刀石头布quot;,阿里工程师如何办到?
- AI新时代-大神教你使用python+Opencv完成人脸解锁(附源码)
- MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发
- 最快60秒完成新冠病毒核酸对比 阿里云向社会免费开放基因计算服务