Path: blob/master/modules/fifo_lock.py
3055 views
import threading1import collections234# reference: https://gist.github.com/vitaliyp/6d54dd76ca2c3cdfc1149d33007dc34a5class FIFOLock(object):6def __init__(self):7self._lock = threading.Lock()8self._inner_lock = threading.Lock()9self._pending_threads = collections.deque()1011def acquire(self, blocking=True):12with self._inner_lock:13lock_acquired = self._lock.acquire(False)14if lock_acquired:15return True16elif not blocking:17return False1819release_event = threading.Event()20self._pending_threads.append(release_event)2122release_event.wait()23return self._lock.acquire()2425def release(self):26with self._inner_lock:27if self._pending_threads:28release_event = self._pending_threads.popleft()29release_event.set()3031self._lock.release()3233__enter__ = acquire3435def __exit__(self, t, v, tb):36self.release()373839