在 Python 中不释放条件实现中的锁定
Without releasing lock in Condition implementation in Python
我有一个关于 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
...
我发现它只是获取了锁,而没有在waiter上调用release(),所以它只是让Python GC销毁waiter吗?好吃吗?
是的,对于那种特定情况 - waiter.acquire()
在未指定 timeout
时被调用 - 一旦 wait
退出,waiter
对象将超出范围; waiter
从 notify
调用中的 self.__waiters
中删除,调用 waiter.acquire()
停止阻塞是必需的,因此将引用该对象以保留它活。由于在 wait
完成时没有幸存的引用,整个对象将被垃圾收集器销毁,这意味着没有理由显式释放锁。
我有一个关于 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
...
我发现它只是获取了锁,而没有在waiter上调用release(),所以它只是让Python GC销毁waiter吗?好吃吗?
是的,对于那种特定情况 - waiter.acquire()
在未指定 timeout
时被调用 - 一旦 wait
退出,waiter
对象将超出范围; waiter
从 notify
调用中的 self.__waiters
中删除,调用 waiter.acquire()
停止阻塞是必需的,因此将引用该对象以保留它活。由于在 wait
完成时没有幸存的引用,整个对象将被垃圾收集器销毁,这意味着没有理由显式释放锁。