尝试创建一个可以使用threading.lock锁定对象的类:
class ObjectLock(object):
def __init__(self):
self._lock = threading.Lock()
self._value = False
def __str__(self):
self.acquire()
try:
if(self._value):
return self._value
else:
return self._value
finally:
self.release()
def __enter__(self):
self.acquire()
def __exit__(self, type, value, traceback):
self.release()
def acquire(self):
self._lock.acquire()
def release(self):
self._lock.release()
def locked(self):
return self._lock.locked()
lock = ObjectLock()
print(lock)
with lock:
print (lock)
问题是我正在尝试实施“with”。如果在“with”块中调用方法(例如 str ,则会重新获取锁定...这很糟糕。我必须创建一组单独的方法来调用知道我在锁定工作吗?
答案 0 :(得分:2)
首先,我不明白为什么__str__
需要获得锁定,所以我认为这个前提是没有实际意义的。
如果您确定需要内部锁定,请考虑使用可重入锁定,例如threading.RLock
。这样,单个线程就能够根据需要多次获取锁,而不会发生死锁。
答案 1 :(得分:1)
不使用threading.Lock
,而是使用threading.Rlock
。这是一个可重入锁,它允许同一个线程多次获取锁。
答案 2 :(得分:0)
使用可重入锁(threading.RLock)
答案 3 :(得分:0)
当我知道自己时,是否必须创建一组单独的方法来调用 在锁内工作?
没有。这已经为你完成了。 threading.RLock
类(可重入锁定)为您处理此问题,它实现与Lock
相同的接口。
R
角色会神奇地挥舞你的问题。