浅谈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实现通过代理服务器访问远程url的方法
Apr 29 Python
Django Highcharts制作图表
Aug 27 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Django 大文件下载实现过程解析
Aug 01 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 Python
Python基础教程之输入输出和运算符
Jul 26 Python
详解Python中下划线的5种含义
Jul 15 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 动态执行带有参数的类方法
2009/04/10 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
实例讲解PHP表单处理
2019/02/15 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
Python切片用法实例教程
2014/09/08 Python
numpy数组拼接简单示例
2017/12/15 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
没编程基础可以学python吗
2020/06/17 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
法院授权委托书格式
2014/09/28 职场文书
建议书格式
2015/02/04 职场文书
2015年读书月活动总结
2015/03/26 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
《绝招》教学反思
2016/02/20 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书