|
from queue import Full, Queue |
|
from time import monotonic as time |
|
|
|
|
|
|
|
class Dequeue(Queue): |
|
def putleft(self, item, block=True, timeout=None): |
|
with self.not_full: |
|
if self.maxsize > 0: |
|
if not block: |
|
if self._qsize() >= self.maxsize: |
|
raise Full |
|
elif timeout is None: |
|
while self._qsize() >= self.maxsize: |
|
self.not_full.wait() |
|
elif timeout < 0: |
|
raise ValueError("'timeout' must be a non-negative number") |
|
else: |
|
endtime = time() + timeout |
|
while self._qsize() >= self.maxsize: |
|
remaining = endtime - time() |
|
if remaining <= 0.0: |
|
raise Full |
|
self.not_full.wait(remaining) |
|
self._putleft(item) |
|
self.unfinished_tasks += 1 |
|
self.not_empty.notify() |
|
|
|
def putleft_nowait(self, item): |
|
return self.putleft(item, block=False) |
|
|
|
def _putleft(self, item): |
|
self.queue.appendleft(item) |
|
|