不在Python中的Condition实现中释放锁定

时间:2015-03-17 16:15:36

标签: python garbage-collection conditional-statements

我对Condition.wait()有疑问。这是我在threading.py中第339行读到的源代码:

    def wait(self, timeout=None):
    ...
    if not self._is_owned():
        raise RuntimeError("cannot wait on un-acquired lock")
    waiter = _allocate_lock()
    waiter.acquire()
    self.__waiters.append(waiter)
    saved_state = self._release_save()
    try:  
        if timeout is None:
            waiter.acquire()    # my question here
    ...

我发现它只是在服务员之后没有调用release()获取锁定,所以它只是让Python GC摧毁服务员?好吗?

1 个答案:

答案 0 :(得分:0)

是的,针对该特定情况 - 在未指定waiter.acquire()时调用timeout - waiter对象将在wait退出后立即超出范围; waiter self.__waiters内部的notify waiter.acquire()调用wait调用{{1}}来阻止{{1}},因此会引用该对象来保留它活。由于{{1}}完成时没有幸存的引用,整个对象将被垃圾收集器破坏,这意味着没有理由明确释放锁。