代码示例
import threading
a = 0
b = 0
def change_values():
global a, b
a, b = 1, 2
threads = []
for _ in range(100):
t = threading.Thread(target=change_values)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"a: {a}, b: {b}")
原理解释
- 多变量赋值原子性含义:原子性操作是指不会被线程调度机制打断的操作,一旦开始,就一直运行到结束,中间不会有任何上下文切换。在Python中,多变量赋值
a, b = 1, 2
理论上是原子性的。
- 代码验证逻辑:
- 定义了全局变量
a
和 b
初始值都为 0
。
change_values
函数对 a
和 b
进行多变量赋值 a, b = 1, 2
。
- 创建100个线程同时执行
change_values
函数。如果多变量赋值不是原子性的,在多线程环境下,可能会出现 a
和 b
的值不一致的情况,比如 a
被赋值为 1
但 b
还没来得及被赋值为 2
就被其他线程打断。
- 最后通过打印
a
和 b
的值来验证。如果每次运行程序,a
总是 1
且 b
总是 2
,则说明多变量赋值在Python中是原子性的。实际上,由于Python的CPython解释器的实现机制,多变量赋值在字节码层面是原子性操作,在这个测试中,a
和 b
的值总会被正确赋值。