关于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?》


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

查看所有标签

猜你喜欢:

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

精通正则表达式

精通正则表达式

Jeffrey E. F. Friedl / 余晟 / 电子工业出版社 / 2007 / 75

随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。本书是讲解正则表达式的经典之作。本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Ja......一起来看看 《精通正则表达式》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具