1:
import threading
num = 0 # 非原子操作 资源竞争
l = [] # GIL 原子操作
def work1():
global num
for i in range(1000000):
num += 1
l.append(i) # 一个字节码指令
print(num, len(l))
def work2():
global num
for i in range(1000000):
num += 1
l.append(i)
print(num, len(l))
if __name__ == '__main__':
first_threading = threading.Thread(target=work1)
second_threading = threading.Thread(target=work2)
first_threading.start()
# first_threading.join() # 在第二个开始前
second_threading.start()
print("主线程继续。。。。。。")
结果:
主线程继续。。。。。。
1486523 1917864
1568659 2000000
多线程会出现资源竞争,导致num自加操作不准
GIL全局解释所,是线程安全,级别字节码。对于list的append操作是安全的。