我对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摧毁服务员?好吗?
答案 0 :(得分:0)
是的,针对该特定情况 - 在未指定waiter.acquire()
时调用timeout
- waiter
对象将在wait
退出后立即超出范围; waiter
self.__waiters
内部的notify
waiter.acquire()
调用wait
调用{{1}}来阻止{{1}},因此会引用该对象来保留它活。由于{{1}}完成时没有幸存的引用,整个对象将被垃圾收集器破坏,这意味着没有理由明确释放锁。