浅谈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中使用HTMLParser解析HTML的教程
Apr 29 Python
python非递归全排列实现方法
Apr 10 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python使用代理ip访问网站的实例
May 07 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
Python类装饰器实现方法详解
Dec 21 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
JavaScript中“+=”的应用
2007/02/02 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
Python 闭包的使用方法
2017/09/07 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
python区块及区块链的开发详解
2019/07/03 Python
python关闭占用端口方式
2019/12/17 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python将unicode和str互相转化的实现
2020/05/11 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
Internet体系结构
2014/12/21 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
实习自我鉴定模板
2013/09/28 职场文书
公司年底活动方案
2014/08/17 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2016春季运动会前导词
2015/11/25 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript
Python自动化实战之接口请求的实现
2022/05/30 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS