python Lock.acquire(0)的作用

python Lock.acquire(0)的作用

threading模块中的Lock为常用对象,其加锁方法acquire()有两个参数: blocking 和 timeout。blocking参数默认为True,即堵塞模式,常用acquire(1)表示。这时意味着如果是第一个线程,则加锁。如果是后面的线程,则堵塞,直到前面的线程释放锁后加锁。
如果blocking参数为False,即acquire(0)哪?说明里是说其设置为False,则如果其他线程已经获取了锁,它将不会阻塞线程,并且将返回False。 其默认值为True。
我们经常用的是acquire(1)。acquire(0)怎么使用?
经过验证,acquire(0)如果是第一个获取锁的线程,则直接加锁,返回True。如果其他线程已加锁,则返回False,同时非堵塞。这个可用于检测是否资源已加锁,根据返回的情况做不同处理。比如可再次acquire(1),进行堵塞,此时不会死锁。
如下面代码:
from threading import Lock, Thread
from time import sleep
def myget(name):
print(‘myget: ‘, name)
lock.acquire()
sleep(2)
print(’________________________’)
lock.release()
print(‘myget: over’)

def myset(name):
print(‘myset: ‘, name)
if lock.acquire(0):
sleep(3)
print(’________________________’)
lock.release()
else:
lock.acquire(1)
print(‘unblocked’)
lock.release()
print(‘myset: over’)

if name == ‘main’:
names = [‘alpha’, ‘beta’]
lock = Lock()
thread_a = Thread(target=myget, args=(names[0],))
thread_b = Thread(target=myset, args=(names[1],))

thread_a.start()
thread_b.start()

thread_a.join()
print('<<<<<<<<<<<')
print(lock.locked())
thread_b.join()

运行结果为:
D:\Programs\Python\Python38-32\python.exe E:/PycharmProjects/cp/src/ch04/test_lockdead.py
myget: alpha
myset: beta


myget: over
<<<<<<<<<<<
False
unblocked
myset: over

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值