在Python2.7中锁定超时

时间:2016-02-02 09:47:02

标签: python multithreading concurrency locking

此处接受的解决方案并非适用于所有情况,

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()  

然而,在尝试之后,旋转锁几乎总是会对阻挡锁而言。 还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

原来,python队列中有一个超时功能 2.7中的Queue module

我可以通过执行此操作来模拟锁定时间

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