什么是Python的GIL?

论坛 期权论坛 期权     
真格量化   2019-7-12 09:46   4415   0
概述


GIL(Global Interpreter Lock)是什么东西?为什么当一些Pythoners在开发一些多线程操作的时候,都会对于GIL有很多疑问?多线程性能真的会遇到瓶颈吗?开发者该如何实现多线程并发操作?今天我们简单介绍一下GIL。


GIL原理


由于Python是动态解释性语言,即解释运行,运行Python代码时都会通过Python解释器解释执行,Python官方默认的解释器是Cython,当然我们也可以选择自己的Python解释器(PyPy,JPython等)。其中JPython就没有GIL的限制。在解释器解释执行任何Python代码时,首先都需要在运行时获取GIL,在I/O阻塞时释放GIL。如果没有涉及I/O操作,只是CPU密集型操作或者,解释器会每隔100 ticks(低级的解释器指令)就释放GIL(通过 sys.setcheckinterval来修改)。GIL是实现Python解释器(Cython)时所引入的一个概念。GIL也不是Python的专有特性。





线程执行模型


我们先看一下Python下多任务线程执行模型:



从上图中可以看出,这个是三个线程”协作式“执行,当Thread1执行时它获得GIL,其它线程一直在等待;当遇到I/O处理时,Thread1会释放GIL,Thread2得到GIL,Thread2开始运行,如此反复直到任务完成。当任一个线程正在运行时,它控制着GIL,并且在处理I/O(read,write,send,recv,etc.)时释放GIL。CPU密集型(不提供I/O操作)的线程作为特殊的情况被处理,即每运行100个低级的解释器指令进行检查并根据线程优先级进行释放/重新获取或者释放GIL。


我们来看一段Python代码:

上述的例子是一个很典型的CPU密集任务,threading是Python高级别的线程库,Count只是普通的函数运行在一个主线程内。这就是为什么Python多线程的并不是真正意义上的多线程。Python的Thread是真实操作系统的Thread,两者没有差别。在Linux下是由pthreads实现的,而在Windows下是由Windows threads实现的,并通过操作系统调度算法进行调度。为了充分利用CPU,Python计算当前已执行了多少数量的指令达到阈值就会立即(100 ticks)来释放GIL。


我们分析一下程序问题:

count函数里面主要做的是计算,I/O操作一直没有触发,那么就会一直等待直到100 ticks才会释放GIL。从释放GIL到获取GIL之间几乎是没有间隙的。所以在其他核心上的线程被唤醒时,大部分情况下主线程已经又再一次获取到GIL了。这个时候被唤醒执行的线程就会占用CPU时间,等着另一个线程拿着GIL去执行任务。然后达到切换时间后进入待调度状态,再被唤醒,再等待,以此往复,降低了效率。


如何避免GIL影响


CPU密集型下的任务尽量采用多进程处理(multiprocessing).


如果我们不使用Cython解释器,就没有这个限制,当然很多Cython的特性也放弃了。


利用 ctypes 绕过 GIL.ctypes会在调用C函数前释放GIL,可以通过ctypes和C动态库来让 python充分利用物理内核的计算能力。

内容来源:http://www.dabeaz.com/python/UnderstandingGIL.pdf

— — — — — — E N D — — — — — —
往期文章:
Numpy处理tick级别数据技巧
真正赚钱的期权策略曲线是这样的
多品种历史波动率计算
如何实现全市场自动盯盘
AI是怎样看懂研报的
真格量化策略debug秘籍
真格量化对接实盘交易
常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法
如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

活用订单类型规避频繁撤单风险

真格量化回测撮合机制简介

如何调用外部数据

如何处理回测与实盘差别

如何利用趋势必然终结获利

常见量化策略介绍

期权交易“七宗罪”

波动率交易介绍

推高波动率的因素

波动率的预测之道

趋势交易面临挑战
如何构建知识图谱
机器学习就是现代统计学

AI技术在金融行业的应用

如何避免模型过拟合

低延迟交易介绍

架构设计中的编程范式

交易所视角下的套利指令撮合

距离概念与特征识别

气象风险与天气衍生品

设计量化策略的七个“大坑”

云计算在金融行业的应用

机器学习模型评估方法
真格量化制作期权HV-IV价差
另类数据介绍

TensorFlow中的Tensor是什么?

机器学习的经验之谈

用yfinance调用雅虎财经数据

容器技术如何改进交易系统
Python调用C++
如何选择数据库代理
统计套利揭秘
[h1]一个Call搅动市场?让我们温习一下波动率策略[/h1][h1]如何用真格量化设计持仓排名跟踪策略[/h1][h1]还不理解真格量化API设计?我们不妨参考一下CTP平台[/h1][h1]理解同步、异步、阻塞与非阻塞[/h1][h1]隐波相关系数和偏度——高维风险的守望者[/h1]Delta中性还不够?——看看如何设计Gamma中性期权策略
[h1]Python的多线程和多进程——从一个爬虫任务谈起[/h1]线程与进程的区别皮尔逊相关系数与历史K线匹配
Python2和Python3的兼容写法Python代码优化技巧
理解Python的上下文管理器
如何写出更好的Python代码?这是Python软件基金会的建议
评估程序化模型时我们容易忽视的指标
看看如何定位Python程序性能瓶颈[url=http://mp.weixin.qq.com/s?__biz=MzU4OTg0NjkyOA==&mid=2247484172&idx=1&sn=6506234560cb872dd661f1d59691dcf5&chksm=fdc603f3cab18ae5d0f793b30e49e2413563de94c120b68de25af748960e84692f571894f929&token=1953138479&lang=zh_CN&scene=21#wechat_redirect][/url]




真格量化可访问:
https://quant.pobo.net.cn


真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群  726895887














































分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:870
帖子:180
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP