玩转python(2)多线程的历史2

线程这个概念早在多核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文件),然后由解释器进行解释。类似于在高级语言和汇编语言之间还多了一层中间语言。
1191862-20180508151911478-404355098.png


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年第五届中国通用人工智能年会

来源:知乎-刘凯-AGI现阶段,人工智能热正迅速“退烧”而回归理性,主流人工智能学界急切寻觅新的突破口。通用人工智能再次获得关注,并被期待成为下一轮技术引爆点。中国通用人工智能年会已成功举办四届,涉及计算机科学、…

post发送byte数组_KAFKA消息发送

消息发送的整体架构RecordAccumulator 主要用来缓存消息以便 Sender 线程可以批量发送,进而减少网络传输的资源消耗以提升性能。RecordAccumulator 缓存的大小可以通过生产者客户端参数 buffer.memory 配置,默认值为 33554432B,即32MB。如果生…

未来的趋势发展 802.11v网络协议解析

目前的无线网络中,一个基站通常与拥有最强信号的接入点联系在一起。但是,这个接入点也许过载了。在802.11v标准中,包括了一个指令,接入点能够使用这个指令要求一个基站报告它支持的无线电信道、传输的功率范围、数据速率和支持的身…

从特斯拉到爱因斯坦,物理学家为何钟情于猫

牛顿和猫洞的故事,图片来自3milliondogs.com来源:数学中国尽管我们看到了大量的猫被用作实验对象。面对科学发展过程中这黑暗一面,我有必要强调一下,纵观历史,许多物理学家与他们的猫的关系要友好得多,猫成…

win10远程桌面连接凭据怎么设置_想在家办公,只需打开win10远程桌面连接就可以了,还犹豫什么...

远程桌面连接是一种使用户能够坐在一台计算机前连接到其他位置的“远程计算机”的技术。例如,用户可以从家庭计算机连接到工作计算机,并访问所有程序、文件和网络资源,就好像坐在工作计算机前一样。另外,用户可以让程序在工作计算…

Java的加载与执行

Java的运行包含两个特别重要的阶段:编译阶段,运行阶段。 编译阶段:编译阶段的主要任务是检查Java源程序是否符合Java语法。 符合Java语法则能够生成正常的字节码文件(xxxx.class) 不符合Java语法规则则无法生成字节码…

费曼:所有的科学知识都是不确定的

编辑 ∑Gemini来源:设计与哲学一、不存在决定什么是好概念的权威 观察是一个概念是否含有真理的判官,但这个概念从何而来的呢?科学的快速进步和发展要求人类发明出一些东西用以检验。在中世纪,人们认为只要多做观察,观察结果本身就…

Java--PATH环境变量

JDK安装成功后,对源程序首先需要进行的就是编译。 在DOS环境下输入javac,会出现以下提示:javac 不是内部或外部命令,也不是可运行的程序 或批处理文件。 出现这个问题的原因是:Windows操作系统无法找到javac命令文件…

RISC-V会被卡吗?那么你觉得C语言会不会被卡? | 包云岗

来源: 风云之声本文是对于知乎问题《从技术的角度来看,RISC-V 能对芯片发展、科技自主起到哪些作用?》的回答(https://www.zhihu.com/question/425542531/answer/1607862976)。一、关于RISC-V的一些解读看到很多回答都…

easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法

在使用SolidWorks进行产品设计时,常用的标准件(如螺栓、螺母、垫圈等)通常可以在安装了SolidWorksToolbox插件后调出使用,而许多标准件在Toolbox并不存在,不能从插件中直接调用。在用到这些零件时,设计人员…

【测试设计】基于正交法的测试用例设计工具--PICT

前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法,但是实际工作过程中当成对组合量太大,我们往往很难做到有效的用例覆盖。 PICT是微软公司出品的一款成对组合命令行生成工具,它很好的解决了上述的难题。使用它我们可以有效地按照两两测试的…

Alpha fold: 人工智能在蛋白质结构预测上跑赢人类的启示

来自孙卫涛科学网博客2020年12月,Alpha Fold2在CASP14上 获得了惊人的进步,其蛋白质结构预测的能力已经达到了与实验方法相媲美的程度,国内外该领域的专家学者都为之惊叹,同时也都感受到巨大的压力,人工智能首次把一个…

卷积神经网络爬虫实现新闻在线分类系统

卷积神经网络&&爬虫实现网易新闻自动爬取并分类 项目地址 采用THUCnews全部数据集进行训练,效果如下。 详细实现见./text_classification 部署步骤如下: 运行环境 服务器:Ubuntu 16.04 数据库:Mysql 5.6 python&#xf…

搞基础理论研究有什么用?

来源:数学中国人类文明的诞生是一个奇迹,构筑在现代科学技术基础之上的现代人类文明的诞生更是奇迹中的奇迹。这个奇迹中的奇迹的根基是现代技术及其广泛应用,而现代技术的根基则是现代科学,科学的根基是以数学为主要工具的基础科…

由内而外:大脑是如何形成感官记忆的

大数据文摘出品来源:sciencedaily编译:张大笔茹通常,大脑会对我们感官收集的信息进行编码。为了感知环境并与之进行建设性的互动,这些感官信号需要在以往的经验和当前目标的背景下进行解释。最新一期的《科学》杂志上,…

oracle clob截取_Oracle数据库设计规范建议

Oracle-数据库设计规范建议来源于项目资料目的本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好的保证。数据库设计是指…

揭秘美国空军如何用AI技术提升“战斗力”

以AI技术为基础,美国空军正努力将自身转化为更强调协作性的组织。来源丨Forbes作者丨Kathleen Walch编译丨科技行者通过增加数据规模与相关素养提升,美国空军各部门及人员,将建立起更强的决策、战略、任务执行以及网络安全保障效率与能力。以…

数字孪生:如何撑起一个万亿市场的产业变革?

来源: 脑极体 今天我们介绍一个在产业界如火如荼,但大众还非常陌生的概念:数字孪生(Digital Twin)。在解释这一晦涩难懂的概念前,我首先想到了一个人,前苏联著名的昆虫学家、数学家和哲学家——…

二、python框架相关知识体系

Django框架 1、django框架、flask框架和Tornado框架的区别? django框架,内置组件多,自身功能强大,是一个大而全的框架,ORM、Admin、中间件、Form、ModelFrom、信号、缓存、csrf等flask框架,内置组件少&…

Android跟web哪个好,比系统自带的WebView更好用 | AgentWeb

名称AgentWeb语言Android平台GitHub作者Justson在混合化开发大行其道的今天,安卓开发经常会用到WebView,用于加载网页。系统自带的WebView性能和流畅度都一般,今天给大家推荐一款第三方WebView,性能比系统自带的要好,功…