关于Python全局变量的thread-safe

栏目: Python · 发布时间: 6年前

内容简介:我们知道python的全局解释器锁(GIL)用于确保Python同一时刻只能有一条线程在执行(也就是其实Python中的多线程是假的,将其理解成协程似乎更加合理)。在Python多线程运行的情况下,全局解释器一般只在字节码之间进行线程切换,所以,我们在编写Python代码的时候,可以认为一条字节码的执行是“原子的”(字节码对应的C实现也被认为是“原子执行的”)。理解了上面的实现之后,我们知道,只要知道python代码对应的字节码是什么,我们就可以知道那些操作是“原子的”;但是实际上,我们不可能当“人肉解释器

我们知道 python 的全局解释器锁(GIL)用于确保Python同一时刻只能有一条线程在执行(也就是其实Python中的多线程是假的,将其理解成协程似乎更加合理)。在Python多线程运行的情况下,全局解释器一般只在字节码之间进行线程切换,所以,我们在编写Python代码的时候,可以认为一条字节码的执行是“原子的”(字节码对应的C实现也被认为是“原子执行的”)。

理解了上面的实现之后,我们知道,只要知道python代码对应的字节码是什么,我们就可以知道那些操作是“原子的”;但是实际上,我们不可能当“人肉解释器”。这里,我们只想知道我们常见的共享于python多线程的变量的哪些操作是“原子的”。对于buildin 数据类型(int,list,dict等)的简单操作通常是只用一条字节码就完成的,但是复杂的操作则不一定了。

例如对于内建类型,下面的操作是原子的(L、L1、L2是list,D、D1、D2是dict,x、y是object,i、j是int):

L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()

但是下面的例子则不是原子的:

i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1

通常,那些引起replace其他对象的操作,可能会触发对象的 __del__ 方法,因此不是原子的。需要特别注意的是对list和dict的批量更新,这通常也不是原子的。

讲了这么多,其实有时很难区分对对象的哪些操作是 simple operation(对应于原子操作),哪些是 composite operations(对应于非原子操作)。所以《Google Python style guide》建议:

Do not rely on the atomicity of built-in types.

While Python’s built-in data types such as dictionaries appear to have atomic operations, there are corner cases where they aren’t atomic (e.g. if hash or eq are implemented as Python methods) and their atomicity should not be relied upon. Neither should you rely on atomic variable assignment (since this in turn depends on dictionaries).

我们不应该依赖CIL带来的原子性,当有thread-safe疑虑的时候,应该毫不犹豫就上锁。

参考 《What kinds of global value mutation are thread-safe?》


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深度解析淘宝运营

深度解析淘宝运营

刘涛 / 电子工业出版社 / 2015-9-1 / 49.00元

淘宝运营,仅有知识是不够的,还需要有系统的运营思路。为帮助广大电商从业者以及众多中小卖家更好地运营店铺,《深度解析淘宝运营》全面阐述了整个店铺运营的重点环节,包括淘宝搜索规则、打造爆款、店铺规划、客户服务、直通车、钻石展位、数据分析等内容。具体操作步骤翔实,并且结合笔者的实际操作经验,将各个环节最本质的一面透彻展现给读者,结合理论与实战,尽可能向读者展示一个最真实的运营核心。《深度解析淘宝运营》没......一起来看看 《深度解析淘宝运营》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试