代码之家  ›  专栏  ›  技术社区  ›  Juanjo Conti

如何知道是否释放了python多处理.lock?

  •  3
  • Juanjo Conti  · 技术社区  · 15 年前
    >>> 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()?

    3 回复  |  直到 14 年前
        1
  •  6
  •   ddotsenko    15 年前

    这个问题有点不清楚。您要么需要使用信号灯而不是锁,要么检查锁是否被锁定。

    例如,python的锁与.net上的锁不同。python的锁一旦解锁,将释放在同一锁上获得()并暂时阻塞的所有其他线程。任何线程都可以同时释放和运行。所以,不要再做第二次中继

    if l.locked():
        l.release()
    

    如果您想要“排队”行为,其中只有一个tread在某些其他版本发布后将获得锁的所有权,那么可以使用信号量、事件或其他类似的类来允许嵌套的锁定和排队行为。

    值得注意的是,其他语言/loolkits(如.NET)都以本地方式进行锁排队,线程可以按顺序堆积lock.acquire,按照acquire队列的顺序阻塞并取得锁对象的所有权,而不是一次全部释放。

    (编辑:忘记将父级设置为“if l.locked:l.realse()”。更正了代码。lock.locked在cpython 2.6.x、3.x、Ironpython 2.6.1中被确认为一种现有的方法)

        2
  •  6
  •   Jeremy Brown    15 年前

    期望是获得锁的上下文应该知道何时应该释放它。在什么情况下,您会多次尝试释放它?

        3
  •  0
  •   Mike    14 年前

    由于lock.acquire()如果成功获取锁,则返回true,因此可以将锁定状态存储在局部变量中,然后将lock.acquire()和后续代码封装到try finally块中。然后在finally块中,您可以查询变量以查看是否已获取锁。如果有,释放。