关键词:线程安全、GIL、原子操作(atomic operation)、存储数据类型(List、Queue.Queue、collections.deque)
当多个线程同时进行,且共同修改同一个资源时,我们必须保证修改不会发生冲突,数据修改不会发生错误,也就是说,我们必须保证线程安全。
同时我们知道,python中由于GIL的存在,即使开了多线程,同一个时间也只有一个线程在执行。
那么这是否就说明python中多个线程执行时,不会发生冲突呢?答案是否定的。
GIL下的线程不安全
来看下面这段代码
import threading
import time
zero = 0
def change_zero():
global zero
for i in range(3000000):
zero += 1
zero -= 1
th1 = threading.Thread(target = change_zero)
th2 = threading.Thread(target = change_zero)
th1.start()
th2.start()
th1.join()
th2.join()
print(zero)
两个线程共同修改zero变量,每次对变量的操作都是先加1再减1,按理说执行3000000次,zero结果应该还是0,但是运行过这段代码发现,结果经常不是0,而且每次运行结果都不一样,这就是数据修改之间发生冲突的