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

时间:2013-03-04 19:06:09

标签: 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):
                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 :(得分:2)

首先,我不明白为什么__str__需要获得锁定,所以我认为这个前提是没有实际意义的。

如果您确定需要内部锁定,请考虑使用可重入锁定,例如threading.RLock。这样,单个线程就能够根据需要多次获取锁,而不会发生死锁。

答案 1 :(得分:1)

不使用threading.Lock,而是使用threading.Rlock。这是一个可重入锁,它允许同一个线程多次获取锁。

答案 2 :(得分:0)

使用可重入锁(threading.RLock)

答案 3 :(得分:0)

  

当我知道自己时,是否必须创建一组单独的方法来调用   在锁内工作?

没有。这已经为你完成了。 threading.RLock类(可重入锁定)为您处理此问题,它实现与Lock相同的接口。

R角色会神奇地挥舞你的问题。