mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2024-06-07 21:20:49 +00:00
38 lines
1020 B
Python
38 lines
1020 B
Python
|
import threading
|
||
|
import collections
|
||
|
|
||
|
|
||
|
# reference: https://gist.github.com/vitaliyp/6d54dd76ca2c3cdfc1149d33007dc34a
|
||
|
class FIFOLock(object):
|
||
|
def __init__(self):
|
||
|
self._lock = threading.Lock()
|
||
|
self._inner_lock = threading.Lock()
|
||
|
self._pending_threads = collections.deque()
|
||
|
|
||
|
def acquire(self, blocking=True):
|
||
|
with self._inner_lock:
|
||
|
lock_acquired = self._lock.acquire(False)
|
||
|
if lock_acquired:
|
||
|
return True
|
||
|
elif not blocking:
|
||
|
return False
|
||
|
|
||
|
release_event = threading.Event()
|
||
|
self._pending_threads.append(release_event)
|
||
|
|
||
|
release_event.wait()
|
||
|
return self._lock.acquire()
|
||
|
|
||
|
def release(self):
|
||
|
with self._inner_lock:
|
||
|
if self._pending_threads:
|
||
|
release_event = self._pending_threads.popleft()
|
||
|
release_event.set()
|
||
|
|
||
|
self._lock.release()
|
||
|
|
||
|
__enter__ = acquire
|
||
|
|
||
|
def __exit__(self, t, v, tb):
|
||
|
self.release()
|