xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/queue.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
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