浅谈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下函数参数的传递(参数带星号的说明)
Sep 19 Python
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
如何使用Django Admin管理后台导入CSV
Nov 06 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
php实现的SESSION类
2014/12/02 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
摘自启点的main.js
2008/04/20 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
python获取糗百图片代码实例
2013/12/18 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
python输入多行字符串的方法总结
2019/07/02 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
表决心的诗句大全
2014/03/11 职场文书
公司委托书格式范文
2014/04/04 职场文书
营销与策划实训报告
2014/11/05 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python