Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
automatic1111
GitHub Repository: automatic1111/stable-diffusion-webui
Path: blob/master/modules/fifo_lock.py
3055 views
1
import threading
2
import collections
3
4
5
# reference: https://gist.github.com/vitaliyp/6d54dd76ca2c3cdfc1149d33007dc34a
6
class FIFOLock(object):
7
def __init__(self):
8
self._lock = threading.Lock()
9
self._inner_lock = threading.Lock()
10
self._pending_threads = collections.deque()
11
12
def acquire(self, blocking=True):
13
with self._inner_lock:
14
lock_acquired = self._lock.acquire(False)
15
if lock_acquired:
16
return True
17
elif not blocking:
18
return False
19
20
release_event = threading.Event()
21
self._pending_threads.append(release_event)
22
23
release_event.wait()
24
return self._lock.acquire()
25
26
def release(self):
27
with self._inner_lock:
28
if self._pending_threads:
29
release_event = self._pending_threads.popleft()
30
release_event.set()
31
32
self._lock.release()
33
34
__enter__ = acquire
35
36
def __exit__(self, t, v, tb):
37
self.release()
38
39