>>> l = Lock()
>>> l.acquire()
True
>>> l.release()
>>> l.release()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: semaphore or lock released too many times
抛出ValueError异常。如何防止多次释放锁定?像l.is_released()?
之类的东西答案 0 :(得分:6)
期望获取锁的上下文应该知道何时应该释放它。在什么情况下你会尝试多次释放它?
答案 1 :(得分:6)
这个问题有点不清楚。您需要使用信号量而不是锁,或检查锁是否被锁定。
例如,Python的锁与.Net上的锁不同。 Python的Lock一旦解锁就会释放在同一个锁上获取()并暂时被阻止的所有其他线程。任何线程都可以释放,所有线程都可以同时运行。所以,不要做第二次重复,而是if l.locked():
l.release()
如果你想要“队列”行为,只有一个脚本会在其他版本发布后获得锁定的所有权,请使用信号量,事件或允许嵌套锁定和排队行为的其他类似类。
有趣的是,其他语言/ loolkits,如.Net,本身会锁定队列,线程可以按顺序堆积lock.acquire,按获取队列的顺序阻止并获取锁定对象的所有权,而不是释放一下子。
(编辑:忘了把父母放在“if l.locked:l.realse()”中。更正了代码。确认Lock.locked是cPython 2.6.x,3.x,IronPython中的当前方法2.6.1)
答案 2 :(得分:1)
创建一个快速包装函数来检查:
from multiprocessing import Lock
l = Lock()
def is_locked():
locked = l.acquire(block=False)
if locked == False:
return True
else:
l.release()
return False
答案 3 :(得分:0)
由于lock.acquire()在成功获取锁定时返回true,因此可以将锁定状态存储在局部变量中,然后将lock.acquire()和后续代码封装在try-finally块中。然后在finally块中,您可以查询变量以查看是否已获取锁定。如果有,请释放。