如何知道是否发布了Python multiprocessing.Lock?

时间:2010-09-01 15:33:39

标签: python multithreading multiprocessing

>>> 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()?

之类的东西

4 个答案:

答案 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块中,您可以查询变量以查看是否已获取锁定。如果有,请释放。