GIL保证字节码级别的原子性和线程安全性,因此当个字节码执行一定是安全的,执行结果一定是一致的。

而有些操作,底层需要通过多个字节码来完成,这样的操作就不是原子的,因此不是线程安全的。举个例子,a+=1 。反编译这个语句,发现它由4个字节码组成:>>> dis.dis(compile('a+=1', '', 'exec'))

1 0 LOAD_NAME 0 (a)

2 LOAD_CONST 0 (1)

4 INPLACE_ADD

6 STORE_NAME 0 (a)

8 LOAD_CONST 1 (None)

10 RETURN_VALUE

这个简单的语句,背后需要 4 个字节码协作完成:LOAD_NAME 将 a 当前的值加载进运行栈;

LOAD_CONST 将常量 1 加载到运行栈;

INPLACE_ADD 对栈上两个操作数进行加法运算;

STORE_NAME 将计算结果保存;

如果你学过汇编的话,你会发现Python字节码跟汇编指令非常像!GIL保证当个字节码的执行不会受到其他线程的任何干扰,但是任何字节码间都可能发生线程切换。

假设两个线程同时自增变量a,a当前值为0;线程A执行到第3步,自增结果1已算出,但未保存;这时线程B得到调度开始执行,同样算出结果1并抢先保存了;A回过头来将结果1保存,B的结果被覆盖了,最终a的值是1。然而,两个线程对a自增,它的值讲道理应该是2!这就是并发操作产生的竞争态,解决方法是用一个锁将这几个字节码作为原子操作保护起来。

我写过一个关于Python虚拟机内部实现的专栏Python源码深度剖析,里面有些许介绍,有兴趣可以看看~

python原子_Python的原子性操作是如何实现的相关推荐

  1. python+办公自动化_Python办公自动化之操作excel

    最近家属的工作有个频繁操作excel的事情,我想到可以利用python的办公自动化来解决这重复性的工作.py5分钟,节约两小时. 整理了思路,理清了操作步骤如下: 安装openpyxl库: 学习pyt ...

  2. python原子变量_Python的原子性操作是如何实现的

    GIL保证字节码级别的原子性和线程安全性,因此当个字节码执行一定是安全的,执行结果一定是一致的. 而有些操作,底层需要通过多个字节码来完成,这样的操作就不是原子的,因此不是线程安全的.举个例子,a+= ...

  3. python原子_python的原子操作

    python编译器会将代码编译为bytecode,对于python而言,每一行bytecode都是原子操作. A global interpreter lock (GIL) is used inter ...

  4. python滚动条_python中selenium操作下拉滚动条的几种方法汇总

    UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...

  5. python 计时_Python计时相关操作详解【time,datetime】

    本文实例讲述了Python计时相关操作.分享给大家供大家参考,具体如下: 内容目录: 1. 时间戳 2. 当前时间 3. 时间差 4. python中时间日期格式化符号 5. 例子 一.时间戳 时间戳 ...

  6. python 离群值_python:删除离群值操作(每一行为一类数据)

    删除有多行字符串的json文件中的离群值 def processhold(eachsubject,directory,newfile): filename = 'cmudatacol/hold/sub ...

  7. python绘画_python绘图骚操作之plotly(一)——plotly的基本绘图方式

    python进阶教程 机器学习 深度学习 长按二维码关注 进入正文 Plotly基础内容介绍 目录 一 plotly简介 二 plotly安装 2.1 安装方式 三 plotly的绘图方式 四 plo ...

  8. python 流写入文件_python文件流操作

    博主在学习python时对文件进行操作时经常踩一下坑.所以专门梳理了一下.有问题麻烦指出哈. python对于文件的操作我们一般是用open().我们根据python的源码可以看出.我们必须要传的参是 ...

  9. python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】

    本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像 ...

最新文章

  1. 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类
  2. mysql导出excel命令,在命令行导出MySQL数据到excel表
  3. ThreadLocal到底有没有内存泄漏?
  4. 直播 | 平安人寿资深算法工程师姚晓远:对话生成模型的探析与创新
  5. 计算机组成原理实验室现状,计算机组成原理实验室
  6. 太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!
  7. spring学习(47):bean的作用域
  8. denied git permission_Git使用之Permission Denied问题解决[2153-Noblog]
  9. hdu 1506 单调栈问题
  10. windows下python xgboost 安装方法以及安装了xgboost,pycharm却不能自动补全问题解决
  11. Word添加脚注自定义标记
  12. 怎样用计算机弹虫儿飞,吉他初学者必看:虫儿飞指弹教程
  13. 加拿大麦吉尔大学计算机科学学院,加拿大麦吉尔大学专业:加拿大麦吉尔大学的院校介绍以及专业设置...
  14. SSL证书错误了怎么办?
  15. post-GWAS:使用coloc进行共定位分析(Colocalization)
  16. 麻雀要革命2 第44节:怦然心动的星月童话
  17. HTML5从入门到精通(千锋教育)免费电子版+PDF下载
  18. LEFT()与RIGHT()函数
  19. chalk.js(node终端样式库)
  20. hackrf前期安装日志

热门文章

  1. 商务人士邮箱推荐?高大上邮箱来了!
  2. 16. 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
  3. 南宁师范大学计算机考研真题,南宁师范大学809综合英语考研真题及答案
  4. Z-Statk协调器 路由器 终端的确定---Simple例程(一)
  5. 食品安全企业标准备案
  6. OpenGL核心技术之SSAO技术讲解(三)
  7. LDAP : python-ldap安装失败解决办法
  8. Python笔记_第一篇_童子功_0.开场白
  9. 白盒测试 Junit 单元测试
  10. 专访神农硒茶有限公司董事长朱自斌:千年茶乡新发展 神农硒茶走世界