python 代码的原子性 atomic

标签:
杂谈 |
分类: python开发 |
python的原子性体现在bytecode上一级,它确保只要是一个bytecode,那么它就是原子的
x = 1
x += 1
1
0
LOAD_CONST
0 (1)
3 LOAD_CONST
1
(2)
6 BUILD_LIST
2
9 STORE_NAME
0
(a)
2
12
LOAD_NAME
0 (a)
15 LOAD_ATTR
1 (append)
18 LOAD_CONST
2
(3)
21 CALL_FUNCTION
1
24 POP_TOP
25 LOAD_CONST
3
(None)
28 RETURN_VALUE
那么,我们看看下面的代码是否是原子的:
def f():
首先,我们要找到该函数的bytecode
http://s12/middle/630c58cbt780d626772fb&690代码的原子性 atomic" TITLE="python 代码的原子性 atomic" />
可以看到,x += 1
可以看到,x += 1
并不是atomic
它对应的bytecode是:
LOAD_FAST
LOAD_CONST # 1
INPLACE_ADD
STORE_FAST
由此可见,x += 1,并不是atomic
下面,写个a.py
a = [1, 2]
a.append(3)
然后,看看list.append是否atomic
python -m dis a.py
python -m dis a.py
可以看到,append是: 21 CALL_FUNCTION:它是原子的
那么, atomic有什么用?
在多线程环境里,只能保证atomic operation是安全的/不线程交叉的
后一篇:pylint的输出