浅谈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的Django框架与认证系统整合的方法
Jul 24 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
python 实现生成均匀分布的点
Dec 05 Python
使用TFRecord存取多个数据案例
Feb 17 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Python pip 常用命令汇总
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函数的常用方法及注意之处小结
2011/07/10 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
详解javascript函数的参数
2015/11/10 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
小程序实现密码输入框
2020/11/16 Javascript
Vue $attrs & inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
python TCP包注入方式
2020/05/05 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
会计助理的岗位职责
2013/11/29 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
入党转预备思想汇报
2014/01/07 职场文书
股份合作协议书
2014/04/12 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
2014年教育工作总结
2014/11/26 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
事业单位岗位说明书
2015/10/08 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
六年级情感作文之500字
2019/10/23 职场文书
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL