Skip to main content
 首页 » 编程设计

python之Python2.7 超时锁定

2025年05月04日39exmyth

这里接受的解决方案并不适用于所有情况,

How to implement a Lock with a timeout in Python 2.7

(特别是当没有人持有条件变量时,最后一个拥有锁的线程调用cond.notify())

然后,我试过这样的自旋锁:

import threading 
import time 
 
class TimeLock(object): 
 
    def __init__(self): 
        self._lock = threading.Lock() 
 
 
    def acquire_lock(self, timeout = 0): 
        ''' If timeout = 0, do a blocking lock 
            else, return False at [timeout] seconds 
        ''' 
        if timeout == 0: 
            return self._lock.acquire()   # Block for the lock 
 
        current_time = start_time = time.time() 
        while current_time < start_time + timeout: 
            if self._lock.acquire(False): # Contend for the lock, without blocking 
                return True 
            else: 
                time.sleep(1) 
                current_time = time.time() 
 
        # Time out 
        return False 
 
    def release_lock(self): 
        self._lock.release()   

然而在尝试之后,自旋锁几乎总是会饿死阻塞锁。 还有其他解决方案吗?

请您参考如下方法:

事实证明,python 队列在它们的队列中有一个超时功能 Queue module在 2.7

我可以通过这样做来模拟一个超时的锁

lock.acquire() -> Queue.get(block=True, timeout=timeout) 
lock.release() -> Queue.put(1, block=False)