浅谈Python中的全局锁(GIL)问题


Posted in Python onJanuary 11, 2019

CPU-bound(计算密集型) 和I/O bound(I/O密集型)

计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态。比如复杂的加减乘除、计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

IO密集型任务(I/O bound)的特点是指磁盘IO、网络IO占主要的任务,CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。

对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如请求网页、读写文件等。当然我们在Python中可以利用sleep达到IO密集型任务的目的。

对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

全局锁问题:

解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。

GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

GIL只会影响到那些严重依赖CPU的程序(比如计算型的)

如果你的程序大部分只会设计到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。实际上,你完全可以放心的创建几千个Python线程, 现代操作系统运行这么多线程没有任何压力,没啥可担心的。

解决方案:

首先,如果你完全工作于Python环境中,你可以使用 multiprocessing 模块来创建一个进程池, 并像协同处理器一样的使用它。

pool = None

# Performs a large calculation (CPU bound)
def some_work(args):
 ...
 return result

def some_thread():
 while True:
  ...
  r = pool.apply(some_work, (args))
  ...

# Initiaze the pool
if __name__ == '__main__':
 import multiprocessing
 pool = multiprocessing.Pool()

另外一个解决GIL的策略是使用C扩展编程技术。 主要思想是将计算密集型任务转移给C,跟Python独立,在工作的时候在C代码中释放GIL。

以上这篇浅谈Python中的全局锁(GIL)问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python映射拆分操作符用法实例
May 19 Python
Python中的with...as用法介绍
May 28 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
Python 实现子类获取父类的类成员方法
Jan 11 #Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 #Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 #Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 #Python
python PrettyTable模块的安装与简单应用
Jan 11 #Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 #Python
pyqt5实现俄罗斯方块游戏
Jan 11 #Python
You might like
PHP中实现图片的锐化
2006/10/09 PHP
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
全面了解js中的script标签
2016/07/04 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
js实现小球在页面规定的区域运动
2020/06/16 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
python机器学习之神经网络实现
2018/10/13 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
安全先进班组材料
2014/12/26 职场文书
业务员岗位职责
2015/02/03 职场文书
先进个人自荐书
2015/03/06 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers