1*cda5da8dSAndroid Build Coastguard Worker'''A multi-producer, multi-consumer queue.''' 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Workerimport threading 4*cda5da8dSAndroid Build Coastguard Workerimport types 5*cda5da8dSAndroid Build Coastguard Workerfrom collections import deque 6*cda5da8dSAndroid Build Coastguard Workerfrom heapq import heappush, heappop 7*cda5da8dSAndroid Build Coastguard Workerfrom time import monotonic as time 8*cda5da8dSAndroid Build Coastguard Workertry: 9*cda5da8dSAndroid Build Coastguard Worker from _queue import SimpleQueue 10*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 11*cda5da8dSAndroid Build Coastguard Worker SimpleQueue = None 12*cda5da8dSAndroid Build Coastguard Worker 13*cda5da8dSAndroid Build Coastguard Worker__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue', 'SimpleQueue'] 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Worker 16*cda5da8dSAndroid Build Coastguard Workertry: 17*cda5da8dSAndroid Build Coastguard Worker from _queue import Empty 18*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 19*cda5da8dSAndroid Build Coastguard Worker class Empty(Exception): 20*cda5da8dSAndroid Build Coastguard Worker 'Exception raised by Queue.get(block=0)/get_nowait().' 21*cda5da8dSAndroid Build Coastguard Worker pass 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Workerclass Full(Exception): 24*cda5da8dSAndroid Build Coastguard Worker 'Exception raised by Queue.put(block=0)/put_nowait().' 25*cda5da8dSAndroid Build Coastguard Worker pass 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Worker 28*cda5da8dSAndroid Build Coastguard Workerclass Queue: 29*cda5da8dSAndroid Build Coastguard Worker '''Create a queue object with a given maximum size. 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Worker If maxsize is <= 0, the queue size is infinite. 32*cda5da8dSAndroid Build Coastguard Worker ''' 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Worker def __init__(self, maxsize=0): 35*cda5da8dSAndroid Build Coastguard Worker self.maxsize = maxsize 36*cda5da8dSAndroid Build Coastguard Worker self._init(maxsize) 37*cda5da8dSAndroid Build Coastguard Worker 38*cda5da8dSAndroid Build Coastguard Worker # mutex must be held whenever the queue is mutating. All methods 39*cda5da8dSAndroid Build Coastguard Worker # that acquire mutex must release it before returning. mutex 40*cda5da8dSAndroid Build Coastguard Worker # is shared between the three conditions, so acquiring and 41*cda5da8dSAndroid Build Coastguard Worker # releasing the conditions also acquires and releases mutex. 42*cda5da8dSAndroid Build Coastguard Worker self.mutex = threading.Lock() 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Worker # Notify not_empty whenever an item is added to the queue; a 45*cda5da8dSAndroid Build Coastguard Worker # thread waiting to get is notified then. 46*cda5da8dSAndroid Build Coastguard Worker self.not_empty = threading.Condition(self.mutex) 47*cda5da8dSAndroid Build Coastguard Worker 48*cda5da8dSAndroid Build Coastguard Worker # Notify not_full whenever an item is removed from the queue; 49*cda5da8dSAndroid Build Coastguard Worker # a thread waiting to put is notified then. 50*cda5da8dSAndroid Build Coastguard Worker self.not_full = threading.Condition(self.mutex) 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker # Notify all_tasks_done whenever the number of unfinished tasks 53*cda5da8dSAndroid Build Coastguard Worker # drops to zero; thread waiting to join() is notified to resume 54*cda5da8dSAndroid Build Coastguard Worker self.all_tasks_done = threading.Condition(self.mutex) 55*cda5da8dSAndroid Build Coastguard Worker self.unfinished_tasks = 0 56*cda5da8dSAndroid Build Coastguard Worker 57*cda5da8dSAndroid Build Coastguard Worker def task_done(self): 58*cda5da8dSAndroid Build Coastguard Worker '''Indicate that a formerly enqueued task is complete. 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker Used by Queue consumer threads. For each get() used to fetch a task, 61*cda5da8dSAndroid Build Coastguard Worker a subsequent call to task_done() tells the queue that the processing 62*cda5da8dSAndroid Build Coastguard Worker on the task is complete. 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker If a join() is currently blocking, it will resume when all items 65*cda5da8dSAndroid Build Coastguard Worker have been processed (meaning that a task_done() call was received 66*cda5da8dSAndroid Build Coastguard Worker for every item that had been put() into the queue). 67*cda5da8dSAndroid Build Coastguard Worker 68*cda5da8dSAndroid Build Coastguard Worker Raises a ValueError if called more times than there were items 69*cda5da8dSAndroid Build Coastguard Worker placed in the queue. 70*cda5da8dSAndroid Build Coastguard Worker ''' 71*cda5da8dSAndroid Build Coastguard Worker with self.all_tasks_done: 72*cda5da8dSAndroid Build Coastguard Worker unfinished = self.unfinished_tasks - 1 73*cda5da8dSAndroid Build Coastguard Worker if unfinished <= 0: 74*cda5da8dSAndroid Build Coastguard Worker if unfinished < 0: 75*cda5da8dSAndroid Build Coastguard Worker raise ValueError('task_done() called too many times') 76*cda5da8dSAndroid Build Coastguard Worker self.all_tasks_done.notify_all() 77*cda5da8dSAndroid Build Coastguard Worker self.unfinished_tasks = unfinished 78*cda5da8dSAndroid Build Coastguard Worker 79*cda5da8dSAndroid Build Coastguard Worker def join(self): 80*cda5da8dSAndroid Build Coastguard Worker '''Blocks until all items in the Queue have been gotten and processed. 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Worker The count of unfinished tasks goes up whenever an item is added to the 83*cda5da8dSAndroid Build Coastguard Worker queue. The count goes down whenever a consumer thread calls task_done() 84*cda5da8dSAndroid Build Coastguard Worker to indicate the item was retrieved and all work on it is complete. 85*cda5da8dSAndroid Build Coastguard Worker 86*cda5da8dSAndroid Build Coastguard Worker When the count of unfinished tasks drops to zero, join() unblocks. 87*cda5da8dSAndroid Build Coastguard Worker ''' 88*cda5da8dSAndroid Build Coastguard Worker with self.all_tasks_done: 89*cda5da8dSAndroid Build Coastguard Worker while self.unfinished_tasks: 90*cda5da8dSAndroid Build Coastguard Worker self.all_tasks_done.wait() 91*cda5da8dSAndroid Build Coastguard Worker 92*cda5da8dSAndroid Build Coastguard Worker def qsize(self): 93*cda5da8dSAndroid Build Coastguard Worker '''Return the approximate size of the queue (not reliable!).''' 94*cda5da8dSAndroid Build Coastguard Worker with self.mutex: 95*cda5da8dSAndroid Build Coastguard Worker return self._qsize() 96*cda5da8dSAndroid Build Coastguard Worker 97*cda5da8dSAndroid Build Coastguard Worker def empty(self): 98*cda5da8dSAndroid Build Coastguard Worker '''Return True if the queue is empty, False otherwise (not reliable!). 99*cda5da8dSAndroid Build Coastguard Worker 100*cda5da8dSAndroid Build Coastguard Worker This method is likely to be removed at some point. Use qsize() == 0 101*cda5da8dSAndroid Build Coastguard Worker as a direct substitute, but be aware that either approach risks a race 102*cda5da8dSAndroid Build Coastguard Worker condition where a queue can grow before the result of empty() or 103*cda5da8dSAndroid Build Coastguard Worker qsize() can be used. 104*cda5da8dSAndroid Build Coastguard Worker 105*cda5da8dSAndroid Build Coastguard Worker To create code that needs to wait for all queued tasks to be 106*cda5da8dSAndroid Build Coastguard Worker completed, the preferred technique is to use the join() method. 107*cda5da8dSAndroid Build Coastguard Worker ''' 108*cda5da8dSAndroid Build Coastguard Worker with self.mutex: 109*cda5da8dSAndroid Build Coastguard Worker return not self._qsize() 110*cda5da8dSAndroid Build Coastguard Worker 111*cda5da8dSAndroid Build Coastguard Worker def full(self): 112*cda5da8dSAndroid Build Coastguard Worker '''Return True if the queue is full, False otherwise (not reliable!). 113*cda5da8dSAndroid Build Coastguard Worker 114*cda5da8dSAndroid Build Coastguard Worker This method is likely to be removed at some point. Use qsize() >= n 115*cda5da8dSAndroid Build Coastguard Worker as a direct substitute, but be aware that either approach risks a race 116*cda5da8dSAndroid Build Coastguard Worker condition where a queue can shrink before the result of full() or 117*cda5da8dSAndroid Build Coastguard Worker qsize() can be used. 118*cda5da8dSAndroid Build Coastguard Worker ''' 119*cda5da8dSAndroid Build Coastguard Worker with self.mutex: 120*cda5da8dSAndroid Build Coastguard Worker return 0 < self.maxsize <= self._qsize() 121*cda5da8dSAndroid Build Coastguard Worker 122*cda5da8dSAndroid Build Coastguard Worker def put(self, item, block=True, timeout=None): 123*cda5da8dSAndroid Build Coastguard Worker '''Put an item into the queue. 124*cda5da8dSAndroid Build Coastguard Worker 125*cda5da8dSAndroid Build Coastguard Worker If optional args 'block' is true and 'timeout' is None (the default), 126*cda5da8dSAndroid Build Coastguard Worker block if necessary until a free slot is available. If 'timeout' is 127*cda5da8dSAndroid Build Coastguard Worker a non-negative number, it blocks at most 'timeout' seconds and raises 128*cda5da8dSAndroid Build Coastguard Worker the Full exception if no free slot was available within that time. 129*cda5da8dSAndroid Build Coastguard Worker Otherwise ('block' is false), put an item on the queue if a free slot 130*cda5da8dSAndroid Build Coastguard Worker is immediately available, else raise the Full exception ('timeout' 131*cda5da8dSAndroid Build Coastguard Worker is ignored in that case). 132*cda5da8dSAndroid Build Coastguard Worker ''' 133*cda5da8dSAndroid Build Coastguard Worker with self.not_full: 134*cda5da8dSAndroid Build Coastguard Worker if self.maxsize > 0: 135*cda5da8dSAndroid Build Coastguard Worker if not block: 136*cda5da8dSAndroid Build Coastguard Worker if self._qsize() >= self.maxsize: 137*cda5da8dSAndroid Build Coastguard Worker raise Full 138*cda5da8dSAndroid Build Coastguard Worker elif timeout is None: 139*cda5da8dSAndroid Build Coastguard Worker while self._qsize() >= self.maxsize: 140*cda5da8dSAndroid Build Coastguard Worker self.not_full.wait() 141*cda5da8dSAndroid Build Coastguard Worker elif timeout < 0: 142*cda5da8dSAndroid Build Coastguard Worker raise ValueError("'timeout' must be a non-negative number") 143*cda5da8dSAndroid Build Coastguard Worker else: 144*cda5da8dSAndroid Build Coastguard Worker endtime = time() + timeout 145*cda5da8dSAndroid Build Coastguard Worker while self._qsize() >= self.maxsize: 146*cda5da8dSAndroid Build Coastguard Worker remaining = endtime - time() 147*cda5da8dSAndroid Build Coastguard Worker if remaining <= 0.0: 148*cda5da8dSAndroid Build Coastguard Worker raise Full 149*cda5da8dSAndroid Build Coastguard Worker self.not_full.wait(remaining) 150*cda5da8dSAndroid Build Coastguard Worker self._put(item) 151*cda5da8dSAndroid Build Coastguard Worker self.unfinished_tasks += 1 152*cda5da8dSAndroid Build Coastguard Worker self.not_empty.notify() 153*cda5da8dSAndroid Build Coastguard Worker 154*cda5da8dSAndroid Build Coastguard Worker def get(self, block=True, timeout=None): 155*cda5da8dSAndroid Build Coastguard Worker '''Remove and return an item from the queue. 156*cda5da8dSAndroid Build Coastguard Worker 157*cda5da8dSAndroid Build Coastguard Worker If optional args 'block' is true and 'timeout' is None (the default), 158*cda5da8dSAndroid Build Coastguard Worker block if necessary until an item is available. If 'timeout' is 159*cda5da8dSAndroid Build Coastguard Worker a non-negative number, it blocks at most 'timeout' seconds and raises 160*cda5da8dSAndroid Build Coastguard Worker the Empty exception if no item was available within that time. 161*cda5da8dSAndroid Build Coastguard Worker Otherwise ('block' is false), return an item if one is immediately 162*cda5da8dSAndroid Build Coastguard Worker available, else raise the Empty exception ('timeout' is ignored 163*cda5da8dSAndroid Build Coastguard Worker in that case). 164*cda5da8dSAndroid Build Coastguard Worker ''' 165*cda5da8dSAndroid Build Coastguard Worker with self.not_empty: 166*cda5da8dSAndroid Build Coastguard Worker if not block: 167*cda5da8dSAndroid Build Coastguard Worker if not self._qsize(): 168*cda5da8dSAndroid Build Coastguard Worker raise Empty 169*cda5da8dSAndroid Build Coastguard Worker elif timeout is None: 170*cda5da8dSAndroid Build Coastguard Worker while not self._qsize(): 171*cda5da8dSAndroid Build Coastguard Worker self.not_empty.wait() 172*cda5da8dSAndroid Build Coastguard Worker elif timeout < 0: 173*cda5da8dSAndroid Build Coastguard Worker raise ValueError("'timeout' must be a non-negative number") 174*cda5da8dSAndroid Build Coastguard Worker else: 175*cda5da8dSAndroid Build Coastguard Worker endtime = time() + timeout 176*cda5da8dSAndroid Build Coastguard Worker while not self._qsize(): 177*cda5da8dSAndroid Build Coastguard Worker remaining = endtime - time() 178*cda5da8dSAndroid Build Coastguard Worker if remaining <= 0.0: 179*cda5da8dSAndroid Build Coastguard Worker raise Empty 180*cda5da8dSAndroid Build Coastguard Worker self.not_empty.wait(remaining) 181*cda5da8dSAndroid Build Coastguard Worker item = self._get() 182*cda5da8dSAndroid Build Coastguard Worker self.not_full.notify() 183*cda5da8dSAndroid Build Coastguard Worker return item 184*cda5da8dSAndroid Build Coastguard Worker 185*cda5da8dSAndroid Build Coastguard Worker def put_nowait(self, item): 186*cda5da8dSAndroid Build Coastguard Worker '''Put an item into the queue without blocking. 187*cda5da8dSAndroid Build Coastguard Worker 188*cda5da8dSAndroid Build Coastguard Worker Only enqueue the item if a free slot is immediately available. 189*cda5da8dSAndroid Build Coastguard Worker Otherwise raise the Full exception. 190*cda5da8dSAndroid Build Coastguard Worker ''' 191*cda5da8dSAndroid Build Coastguard Worker return self.put(item, block=False) 192*cda5da8dSAndroid Build Coastguard Worker 193*cda5da8dSAndroid Build Coastguard Worker def get_nowait(self): 194*cda5da8dSAndroid Build Coastguard Worker '''Remove and return an item from the queue without blocking. 195*cda5da8dSAndroid Build Coastguard Worker 196*cda5da8dSAndroid Build Coastguard Worker Only get an item if one is immediately available. Otherwise 197*cda5da8dSAndroid Build Coastguard Worker raise the Empty exception. 198*cda5da8dSAndroid Build Coastguard Worker ''' 199*cda5da8dSAndroid Build Coastguard Worker return self.get(block=False) 200*cda5da8dSAndroid Build Coastguard Worker 201*cda5da8dSAndroid Build Coastguard Worker # Override these methods to implement other queue organizations 202*cda5da8dSAndroid Build Coastguard Worker # (e.g. stack or priority queue). 203*cda5da8dSAndroid Build Coastguard Worker # These will only be called with appropriate locks held 204*cda5da8dSAndroid Build Coastguard Worker 205*cda5da8dSAndroid Build Coastguard Worker # Initialize the queue representation 206*cda5da8dSAndroid Build Coastguard Worker def _init(self, maxsize): 207*cda5da8dSAndroid Build Coastguard Worker self.queue = deque() 208*cda5da8dSAndroid Build Coastguard Worker 209*cda5da8dSAndroid Build Coastguard Worker def _qsize(self): 210*cda5da8dSAndroid Build Coastguard Worker return len(self.queue) 211*cda5da8dSAndroid Build Coastguard Worker 212*cda5da8dSAndroid Build Coastguard Worker # Put a new item in the queue 213*cda5da8dSAndroid Build Coastguard Worker def _put(self, item): 214*cda5da8dSAndroid Build Coastguard Worker self.queue.append(item) 215*cda5da8dSAndroid Build Coastguard Worker 216*cda5da8dSAndroid Build Coastguard Worker # Get an item from the queue 217*cda5da8dSAndroid Build Coastguard Worker def _get(self): 218*cda5da8dSAndroid Build Coastguard Worker return self.queue.popleft() 219*cda5da8dSAndroid Build Coastguard Worker 220*cda5da8dSAndroid Build Coastguard Worker __class_getitem__ = classmethod(types.GenericAlias) 221*cda5da8dSAndroid Build Coastguard Worker 222*cda5da8dSAndroid Build Coastguard Worker 223*cda5da8dSAndroid Build Coastguard Workerclass PriorityQueue(Queue): 224*cda5da8dSAndroid Build Coastguard Worker '''Variant of Queue that retrieves open entries in priority order (lowest first). 225*cda5da8dSAndroid Build Coastguard Worker 226*cda5da8dSAndroid Build Coastguard Worker Entries are typically tuples of the form: (priority number, data). 227*cda5da8dSAndroid Build Coastguard Worker ''' 228*cda5da8dSAndroid Build Coastguard Worker 229*cda5da8dSAndroid Build Coastguard Worker def _init(self, maxsize): 230*cda5da8dSAndroid Build Coastguard Worker self.queue = [] 231*cda5da8dSAndroid Build Coastguard Worker 232*cda5da8dSAndroid Build Coastguard Worker def _qsize(self): 233*cda5da8dSAndroid Build Coastguard Worker return len(self.queue) 234*cda5da8dSAndroid Build Coastguard Worker 235*cda5da8dSAndroid Build Coastguard Worker def _put(self, item): 236*cda5da8dSAndroid Build Coastguard Worker heappush(self.queue, item) 237*cda5da8dSAndroid Build Coastguard Worker 238*cda5da8dSAndroid Build Coastguard Worker def _get(self): 239*cda5da8dSAndroid Build Coastguard Worker return heappop(self.queue) 240*cda5da8dSAndroid Build Coastguard Worker 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Workerclass LifoQueue(Queue): 243*cda5da8dSAndroid Build Coastguard Worker '''Variant of Queue that retrieves most recently added entries first.''' 244*cda5da8dSAndroid Build Coastguard Worker 245*cda5da8dSAndroid Build Coastguard Worker def _init(self, maxsize): 246*cda5da8dSAndroid Build Coastguard Worker self.queue = [] 247*cda5da8dSAndroid Build Coastguard Worker 248*cda5da8dSAndroid Build Coastguard Worker def _qsize(self): 249*cda5da8dSAndroid Build Coastguard Worker return len(self.queue) 250*cda5da8dSAndroid Build Coastguard Worker 251*cda5da8dSAndroid Build Coastguard Worker def _put(self, item): 252*cda5da8dSAndroid Build Coastguard Worker self.queue.append(item) 253*cda5da8dSAndroid Build Coastguard Worker 254*cda5da8dSAndroid Build Coastguard Worker def _get(self): 255*cda5da8dSAndroid Build Coastguard Worker return self.queue.pop() 256*cda5da8dSAndroid Build Coastguard Worker 257*cda5da8dSAndroid Build Coastguard Worker 258*cda5da8dSAndroid Build Coastguard Workerclass _PySimpleQueue: 259*cda5da8dSAndroid Build Coastguard Worker '''Simple, unbounded FIFO queue. 260*cda5da8dSAndroid Build Coastguard Worker 261*cda5da8dSAndroid Build Coastguard Worker This pure Python implementation is not reentrant. 262*cda5da8dSAndroid Build Coastguard Worker ''' 263*cda5da8dSAndroid Build Coastguard Worker # Note: while this pure Python version provides fairness 264*cda5da8dSAndroid Build Coastguard Worker # (by using a threading.Semaphore which is itself fair, being based 265*cda5da8dSAndroid Build Coastguard Worker # on threading.Condition), fairness is not part of the API contract. 266*cda5da8dSAndroid Build Coastguard Worker # This allows the C version to use a different implementation. 267*cda5da8dSAndroid Build Coastguard Worker 268*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 269*cda5da8dSAndroid Build Coastguard Worker self._queue = deque() 270*cda5da8dSAndroid Build Coastguard Worker self._count = threading.Semaphore(0) 271*cda5da8dSAndroid Build Coastguard Worker 272*cda5da8dSAndroid Build Coastguard Worker def put(self, item, block=True, timeout=None): 273*cda5da8dSAndroid Build Coastguard Worker '''Put the item on the queue. 274*cda5da8dSAndroid Build Coastguard Worker 275*cda5da8dSAndroid Build Coastguard Worker The optional 'block' and 'timeout' arguments are ignored, as this method 276*cda5da8dSAndroid Build Coastguard Worker never blocks. They are provided for compatibility with the Queue class. 277*cda5da8dSAndroid Build Coastguard Worker ''' 278*cda5da8dSAndroid Build Coastguard Worker self._queue.append(item) 279*cda5da8dSAndroid Build Coastguard Worker self._count.release() 280*cda5da8dSAndroid Build Coastguard Worker 281*cda5da8dSAndroid Build Coastguard Worker def get(self, block=True, timeout=None): 282*cda5da8dSAndroid Build Coastguard Worker '''Remove and return an item from the queue. 283*cda5da8dSAndroid Build Coastguard Worker 284*cda5da8dSAndroid Build Coastguard Worker If optional args 'block' is true and 'timeout' is None (the default), 285*cda5da8dSAndroid Build Coastguard Worker block if necessary until an item is available. If 'timeout' is 286*cda5da8dSAndroid Build Coastguard Worker a non-negative number, it blocks at most 'timeout' seconds and raises 287*cda5da8dSAndroid Build Coastguard Worker the Empty exception if no item was available within that time. 288*cda5da8dSAndroid Build Coastguard Worker Otherwise ('block' is false), return an item if one is immediately 289*cda5da8dSAndroid Build Coastguard Worker available, else raise the Empty exception ('timeout' is ignored 290*cda5da8dSAndroid Build Coastguard Worker in that case). 291*cda5da8dSAndroid Build Coastguard Worker ''' 292*cda5da8dSAndroid Build Coastguard Worker if timeout is not None and timeout < 0: 293*cda5da8dSAndroid Build Coastguard Worker raise ValueError("'timeout' must be a non-negative number") 294*cda5da8dSAndroid Build Coastguard Worker if not self._count.acquire(block, timeout): 295*cda5da8dSAndroid Build Coastguard Worker raise Empty 296*cda5da8dSAndroid Build Coastguard Worker return self._queue.popleft() 297*cda5da8dSAndroid Build Coastguard Worker 298*cda5da8dSAndroid Build Coastguard Worker def put_nowait(self, item): 299*cda5da8dSAndroid Build Coastguard Worker '''Put an item into the queue without blocking. 300*cda5da8dSAndroid Build Coastguard Worker 301*cda5da8dSAndroid Build Coastguard Worker This is exactly equivalent to `put(item, block=False)` and is only provided 302*cda5da8dSAndroid Build Coastguard Worker for compatibility with the Queue class. 303*cda5da8dSAndroid Build Coastguard Worker ''' 304*cda5da8dSAndroid Build Coastguard Worker return self.put(item, block=False) 305*cda5da8dSAndroid Build Coastguard Worker 306*cda5da8dSAndroid Build Coastguard Worker def get_nowait(self): 307*cda5da8dSAndroid Build Coastguard Worker '''Remove and return an item from the queue without blocking. 308*cda5da8dSAndroid Build Coastguard Worker 309*cda5da8dSAndroid Build Coastguard Worker Only get an item if one is immediately available. Otherwise 310*cda5da8dSAndroid Build Coastguard Worker raise the Empty exception. 311*cda5da8dSAndroid Build Coastguard Worker ''' 312*cda5da8dSAndroid Build Coastguard Worker return self.get(block=False) 313*cda5da8dSAndroid Build Coastguard Worker 314*cda5da8dSAndroid Build Coastguard Worker def empty(self): 315*cda5da8dSAndroid Build Coastguard Worker '''Return True if the queue is empty, False otherwise (not reliable!).''' 316*cda5da8dSAndroid Build Coastguard Worker return len(self._queue) == 0 317*cda5da8dSAndroid Build Coastguard Worker 318*cda5da8dSAndroid Build Coastguard Worker def qsize(self): 319*cda5da8dSAndroid Build Coastguard Worker '''Return the approximate size of the queue (not reliable!).''' 320*cda5da8dSAndroid Build Coastguard Worker return len(self._queue) 321*cda5da8dSAndroid Build Coastguard Worker 322*cda5da8dSAndroid Build Coastguard Worker __class_getitem__ = classmethod(types.GenericAlias) 323*cda5da8dSAndroid Build Coastguard Worker 324*cda5da8dSAndroid Build Coastguard Worker 325*cda5da8dSAndroid Build Coastguard Workerif SimpleQueue is None: 326*cda5da8dSAndroid Build Coastguard Worker SimpleQueue = _PySimpleQueue 327