stable-diffusion-webui
37 строк · 1020.0 Байт
1import threading2import collections3
4
5# reference: https://gist.github.com/vitaliyp/6d54dd76ca2c3cdfc1149d33007dc34a
6class FIFOLock(object):7def __init__(self):8self._lock = threading.Lock()9self._inner_lock = threading.Lock()10self._pending_threads = collections.deque()11
12def acquire(self, blocking=True):13with self._inner_lock:14lock_acquired = self._lock.acquire(False)15if lock_acquired:16return True17elif not blocking:18return False19
20release_event = threading.Event()21self._pending_threads.append(release_event)22
23release_event.wait()24return self._lock.acquire()25
26def release(self):27with self._inner_lock:28if self._pending_threads:29release_event = self._pending_threads.popleft()30release_event.set()31
32self._lock.release()33
34__enter__ = acquire35
36def __exit__(self, t, v, tb):37self.release()38