浅谈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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
python遍历文件夹并删除特定格式文件的示例
Mar 05 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
python如何实现一个刷网页小程序
Nov 27 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
Python实现快速排序的方法详解
Oct 25 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
zf框架的registry(注册表)使用示例
2014/03/13 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
php实现小程序支付完整版
2018/10/09 PHP
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
python生成随机图形验证码详解
2017/11/08 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Python实现的质因式分解算法示例
2018/05/03 Python
详解flask表单提交的两种方式
2018/07/21 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
卫生安全检查制度
2014/02/04 职场文书
手机促销活动方案
2014/02/05 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
个人主要事迹材料
2014/08/26 职场文书
公司员工离职证明书
2014/10/04 职场文书
工程部岗位职责范本
2015/04/11 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python