您没有正确使用 QMutexLocker。像上下文管理器一样使用它:
from PyQt4.QtCore import QMutex, QMutexLocker
def bad_lock(aLock):
locker = QMutexLocker(aLock)
print "Locked"
raise RuntimeError("Test exception")
return "Should not get here"
def good_lock(aLock):
with QMutexLocker(aLock):
print "Locked"
raise RuntimeError("Test exception")
return "Should not get here"
lock = QMutex()
bad_lock(lock)
print lock.tryLock()
# False
lock.unlock()
good_lock(lock)
print lock.tryLock()
# True
在测试中,您在第一个示例中看到,锁返回仍处于锁定状态。第二,当引发异常时,上下文管理器在离开函数之前释放锁。
当在 C++ 中使用时,我确信 QMutexLocker 会做它应该做的事情,只要作用域结束就会解锁。但是在 Python 中,正如您所发现的,不应该依赖垃圾收集器来进行解锁。通过语句的上下文管理器with
非常适合这一点。您可以通过此类的 C++ 示例显示它只是在函数顶部创建它的方式来判断。而 python 版本同时具有 an__enter__
和__exit__
方法。
最后,with
上下文允许您将关键代码块包装在锁中以限制需要到位的锁的数量,因此您可以执行以下操作:
def good_lock(aLock):
# do a bunch of stuff here
...
# critical section
with QMutexLocker(aLock):
# do critical stuff here
...
# do other stuff here
...
return True