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는 범위가 끝날 때마다 잠금 해제되는 것으로 가정합니다. 그러나 파이썬에서 발견 한 것처럼 가비지 수집기가 잠금 해제를 수행해서는 안됩니다. 컨텍스트 관리자를 통해 with
성명이 완벽합니다. 이 클래스의 C++ 예제가 단순히 함수의 맨 위에 만들어지는 것을 보여주는 방식으로 알 수 있습니다. 반면 파이썬 버전은 __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
출처
2012-06-30 03:35:28
jdi
고맙습니다 I 파이썬이 GC로 작성된 것처럼이 방법이 두렵다.그러나 내가 말했듯이 이것은 QMutexLocker의 전체 아이디어가 무의미합니다. 잠금 해제에 대해 걱정할 필요가 없기 때문입니다. 또한 그것은 예외를 던지지 않는 Im 때 작동하는 것, 다소 이상합니다. 잠금 장치가 삭제 된 시점을 알지 못하는 것과 같은 문제가 있습니까? – Rolle
나는이 대답이 약간 일반적이고 정확한 정보를 둘러싼다고 생각하고, 단지 가정을한다. 제대로 사용될 때 QMutexLocker를 사용할 수 있다는 데는 의문의 여지가 없습니다. 하지만 잠금을 최소화하기 위해 중요한 코드 섹션을 잠그는 것에 대해서는 완전히 동의합니다. – jdi
동의, 그냥 추측했다, 그래서 나는 당신의 대답을 upvoted. – msw