浅谈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 26 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
分享PyCharm的几个使用技巧
Nov 10 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
django使用channels实现通信的示例
Oct 19 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正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
yepnope.js 异步加载资源文件
2011/09/08 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
Python批量转换文件编码格式
2015/05/17 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
财务信息服务专业自荐书范文
2014/02/08 职场文书
家长对孩子的评语
2014/04/18 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
完美的中文自荐信
2014/05/24 职场文书
员工评语范文
2014/12/31 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
校园之声广播稿
2015/08/18 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
一文弄懂MySQL索引创建原则
2022/02/28 MySQL