python线程安全队列

一直困扰我的问题,在博客园和CSDN中都查阅过资料,答案千奇百怪,查阅官网跟几位大牛交流后做了一个小总结:

python中的list,dict,set,tuple都不是线程全队列。因为例如list在append()或者remove()的时候,资源是共享的,然后python没有在这些队列里面封装锁。但python中的queue队列属于线程安全,他底部封装了锁。

所谓线程安全,就是一个线程在同一时间只能被调用一次。

在线程安全中,引入了锁的概念。所谓锁就是当你需要独占某一资源时,你可以锁住这个资源,使得这个资源不会被别的线程占用,当不占用的时候,释放锁就好了。threading模块中定义了Lock类,可以方便的处理锁定,简单代码如下:

#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([blocking])
#释放
mutex.release()

其中,锁定方法acquire可以有一个blocking参数。

如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True) 
如果设定blocking为False,则当前线程不会堵塞 。

上锁解锁过程 
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。

每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。

线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

总结 
锁的好处:

确保了某段关键代码只能由一个线程从头到尾完整地执行 
锁的坏处:

阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了 
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员日子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值