Python之线程与GIL
前言
以下内容是个人学习之后的感悟,转载请注明出处~
线程是什么
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的
基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
GIL是什么
为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,Python当然也逃不开,为了利用多核,Python开
始支持多线程。而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,而当越
来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在
实现时考虑额外的内存锁和同步操作)。
首先需要明确的一点是GIL
并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++
是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。
Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。
然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL
归
结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
GIL的影响
GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。
Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于
GIL而大幅下降。
如何避免GIL的影响
用multiprocessing代替Thread(会增加数据通讯和同步的困难)
用其他解析器(其他解析器太小众,一般都用Cpython解析器)
此外,Python社区也在非常努力的不断改进GIL,甚至是尝试去除GIL。并在各个小版本中有了不少的进步。有兴趣的读者可以扩
展阅读这个Slide 另一个改进Reworking the GIL。
- 将切换颗粒度从基于opcode计数改成基于时间片计数
- 避免最近一次释放GIL锁的线程再次被立即调度
- 新增线程优先级功能(高优先级线程可以迫使其他线程释放所持有的GIL锁)
以上是全部内容,如果有什么地方不对,请在下面留言,谢谢~
最新文章
- C# 图片自由变换 任意扭曲
- mapreduce 输入输出类型
- Android7.0 Phone应用源码分析(一) phone拨号流程分析
- Codevs 1648 最大和
- 【转】Android中自定义控件的步骤
- WinDbg抓取程序报错dump文件的方法
- @Autowired 注释对在哪里和如何完成自动连接提供了更多的细微的控制。
- java基础之修饰符和内部类
- 三、latex源文件的基本结构
- 浅谈Cocos2d-js cc.director
- 校内模拟赛 旅行(by NiroBC)
- 动态创建的 CEdit 被限制长度,增加 ES_AUTOHSCROLL 属性;被无法Tab激活焦点,增加 WS_TABSTOP 属性(转)
- iOS开发-获取设备型号信息
- Android Studio2.1版本后使用虚拟机碰见的问题总结以及其他问题
- Object.keys(obj)--获取对象属性,该方法返回一个数组
- 在Linux中将脚本做成系统服务
- BZOJ4205 : 卡牌配对
- Axure 实现批量的勾选和反选
- zzuli1985(dp/水dfs郑轻比赛)
- 使用EasyWechat快速开发微信公众号支付
热门文章
- GTK入门学习:布局练习之计算器
- Intel® RAID Software Users Guide
- Selenium学习(一)环境搭建
- 将txt文件数据存入excel表格
- LeetCode(82)题解: Remove Duplicates from Sorted List II
- iOS开发 如何检查内存泄漏
- Win10升级.NET Framework 3.5或2.0遇到错误0x800f081f
- 阿里 JAVA 开发手册 学习 4 工程规约
- Docker的远程访问
- HDU5965 扫雷 —— dp递推