Python—创建一个使用threading.lock()锁定对象的类

Python—创建一个使用threading.lock()锁定对象的类,python,multithreading,locking,Python,Multithreading,Locking,尝试创建可以使用threading.lock锁定对象的类: class ObjectLock(object): def __init__(self): self._lock = threading.Lock() self._value = False def __str__(self): self.acquire() try: if(self._value):

尝试创建可以使用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),则会重新获得锁…这是不好的。当我知道自己在锁中工作时,是否必须创建一组单独的方法来调用?

首先,我不明白为什么
\u str\u
需要获取锁,因此我认为前提是没有意义的


如果你确信内部锁定是可取的,考虑使用一个可重入的锁,例如,这样一个线程就可以在不死锁的情况下多次获得锁。

使用可重入锁(线程)。

使用。这是一个可重入的锁,允许同一线程多次获取锁,而不是使用
线程锁

我是否必须创建一个单独的方法集,以便在我知道自己在调用时调用 在锁内工作

不需要。这已经为您完成了。
threading.RLock
类(可重入锁)为您解决了这个问题,它实现了与
lock
相同的接口


R
字符将神奇地将您的问题挥手而去。

在我重新编辑代码之前,您可能已经看到了代码。self.\u值与锁定状态无关