线程这个概念早在多核CPU出现之前就提出来了,单核时代的多线程主要是为了让CPU尽量不处于空闲状态,使其计算能力始终能得到利用。但本质上讲,在任意时刻只有一个线程在执行。

尽管任意时刻只有一个线程在执行,但是依然有些问题需要解决,其中最重要的就是线程安全。这个问题的来源很简单,我之前说过,CPU对指令是一条一条执行的,不过要注意的是,高级语言中的一行代码在汇编语言层面上,可能由多条汇编指令组成的。举一个简单的例子,在c语言中对某个变量做自增操作:

int a = 0;
int add(){a += 1;return a;
}

不过变成汇编指令就不这么简单了,其中实现自增的主要是这两条指令(大部分指令省略):

    movl    a(%rip), %eaxaddl    $1, %eax

这里之所以在例子中使用全局变量,是因为线程安全和数据同步主要是针对全局变量这类可以共享的资源。上面的a(%rip)表示全局变量a的值,%eax是一个寄存器。第一条指令表示把a的值保存在eax寄存器中,第二条指令对eax中的值加上1。
我们来考虑一个情况:现在有两个线程A,B,都要调用add()函数,那么a的预期值应该是2。如果线程A执行完第一条指令后,发生了上下文切换,此时eax寄存器的值是a的初始值0,CPU去执行线程B,线程B执行完毕后,把1返回给a(%rip),再恢复执行线程A,由于线程A不会再去执行第一条指令,因此eax寄存器的值不会被更新,依旧是0,线程A执行完毕后,把1返回给a(%rip)。最终,a(%rip)的值是1而不是2。
上面这种情况就是我们常说的数据不同步,或者线程不安全。对此,人们提出了很多方法,比如原子操作,互斥锁等等,出发点主要是以下两种:

  1. 保证操作不被线程调度机制打断,要么全部完成,要么全部不做;
  2. 即使操作被线程调度机制打断,别的线程也无法获得相关资源的使用权。

现在回到python这门语言上。荷兰人Guido van Rossum为了打发时间,于1989年发明了脚本语言python。和java类似,python源码首先会被编译成字节码(python项目中的pyc文件),然后由解释器进行解释。类似于在高级语言和汇编语言之间还多了一层中间语言。

上图中,一个python表达式可以由多个解释器指令构成,一个解释器指令又可以被分成多个汇编指令,这意味着一个解释器指令可能在执行过程中被打断,事实也确实是这样,python的解释器CPython并不是线程安全的。所以,为了保证线程安全,首先要做到让一个解释器指令能不受线程调度影响被执行完毕,对此python解释器的开发者们捣鼓出了python全局解释器锁,简称GIL。GIL在任一时刻只允许运行一个线程,当一个线程执行时间达到阈值时,释放GIL,这样连线程调度也变得简单了许多。
那么GIL是不是解决了线程安全的问题了呢?没有。这是python中的一个深坑。下一篇博客我会写一些自己在学习GIL时的心得。

转载于:https://www.cnblogs.com/bugsheep/p/9008396.html

玩转python(2)多线程的历史2相关推荐

  1. 玩转Python必备:史上最全的Python库,【值得收藏,事半功倍】

    库名称     简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器 ...

  2. 微课|玩转Python轻松过二级:第3章课后习题解答6

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答227-236题 课后习题解答237-247题 书购买链接 ...

  3. Python+socket+多线程实现同时应答多客户端的自助聊天机器人

    本周推荐书目:<Python程序设计实验指导书>,董付国编著,清华大学出版社 本书详情链接二维码(清华大学出版社天猫官方旗舰店): 送书活动在继续,下周送第五批,详情链接:<Pyth ...

  4. 微课|玩转Python轻松过二级:第3章课后习题解答5

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答180-200题 课后习题解答201-214题 课后习题解答 ...

  5. 微课|玩转Python轻松过二级:第3章课后习题解答4

    2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 =============== 适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. ...

  6. 微课|玩转Python轻松过二级:第3章课后习题解答3

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答103-115 课后习题解答116-129 课后习题解答13 ...

  7. 微课|玩转Python轻松过二级:第3章课后习题解答2

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答46-58 课后习题解答59-82 课后习题解答83-102 ...

  8. 微课|玩转Python轻松过二级:第3章课后习题解答1

    <中学生可以这样学Python>84节微课免费观看地址 ============= 适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详 ...

  9. 微课|玩转Python轻松过二级(3.4节):集合操作与应用

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 3.4.1  集合对象的创建与删除 3.4.2  集合操作与运算 3.4 ...

  10. 微课|玩转Python轻松过二级(3.3节):字典使用要点

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 3.3.2  字典元素的访问 3.3.3  元素的添加.修改与删除 图书 ...

最新文章

  1. Geth 控制台使用及 Web3.js 使用实战
  2. 如何救队友_第五人格中高端局如何救队友,这些技巧很实用,不卡血量是关键...
  3. 高等数学第七版-习题解答:总复习3
  4. linux ftp 后台执行,Linux环境CENTOS下apache-ftpserver搭建配置及后台启动
  5. Java基础笔记之数据类型
  6. 二分(三分)+快速幂
  7. opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
  8. Oracle系统表查询方法
  9. MATLAB模式识别基本操作函数解析
  10. OpenGL中的坐标变换、矩阵变换【转载】
  11. GB28181国标协议
  12. 从一个编程老菜鸟来看Delphi的优点
  13. GD32f103ret6 使用HID,设备管理里,提示未知设备
  14. Spring Boot 支持 HTTPS 如此简单,So easy!
  15. vue cli 脚手架 重新安装步骤
  16. Android6.0风格图标,jQuery仿Android样式扁平风格图标插件
  17. 关于汽车悬挂系统减震控制的进一步研究(自动控制原理课程设计小论文)
  18. 波士顿地区Airbnb价格预测Project (一)
  19. MySQL三表查询(学生表、课程表、成绩表)查询出语文成绩比数学成绩高的学生信息
  20. 查看话单日志和性能日志有效信息的流程

热门文章

  1. 检测ARM板的RTC
  2. redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解
  3. tif 高程_使用ArcGIS提取高程点
  4. 拨号云服务器怎么自动配置网关_云服务器配置网站卡慢怎么办
  5. mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据
  6. Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信
  7. Web框架——Flask系列之abort函数与自定义异常处理(十三)
  8. 天池 在线编程 区分用户名(哈希)
  9. LeetCode 30. 串联所有单词的子串(字符串哈希)
  10. 数据结构--堆 Heap