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

2 投票
4 回答
1836 浏览
提问于 2025-04-17 17:54

我正在尝试创建一个可以使用线程锁来锁定对象的类:

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),锁会被重新获取……这就不好了。我是不是需要创建一套单独的方法来在我知道自己在锁定状态下工作时调用?

4 个回答

0

我需要创建一套单独的方法来调用吗?当我知道自己在一个锁内工作时。

不需要。这些工作已经为你做好了。threading.RLock 类(可重入锁)会为你处理这些问题,它的使用方式和 Lock 是一样的。

那个 R 字母就像魔法一样,可以帮你解决问题。

1

与其使用 threading.Lock,不如使用 threading.Rlock。这个叫做可重入锁,它允许同一个线程多次获得这个锁。

2

首先,我不明白为什么 __str__ 需要获取锁,所以我觉得这个前提没什么意义。

如果你确定内部的锁是必要的,可以考虑使用可重入锁,比如 threading.RLock。这样的话,一个线程可以根据需要多次获取锁,而不会出现死锁的情况。

撰写回答