python队列是线程安全的吗_列表与队列——谈谈线程安全

本文探讨了Python中的线程安全问题,指出在GIL存在的环境下,Python线程并非天然安全。通过示例代码展示了由于非原子操作导致的数据冲突。介绍了原子操作的概念,并举例说明了`Queue`模块的`put`和`get`操作是线程安全的。最后,对比了List、`Queue.Queue`和`collections.deque`在多线程环境下的表现和适用场景。
摘要由CSDN通过智能技术生成

关键词:线程安全、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,而且每次运行结果都不一样,这就是数据修改之间发生冲突的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值