Mercurial > pygame
annotate lib/threads/Py25Queue.py @ 3194:9fcb7abf3185 default tip
Remove some gcc 4.7.2 compiler warnings
| author | Lenard Lindstrom <len-l@telus.net> |
|---|---|
| date | Tue, 23 Apr 2013 19:53:36 -0700 |
| parents | f7ba151c33c6 |
| children |
| rev | line source |
|---|---|
|
2089
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
1 """A multi-producer, multi-consumer queue.""" |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
2 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
3 from time import time as _time |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
4 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
5 from collections import deque |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
6 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
7 __all__ = ['Empty', 'Full', 'Queue'] |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
8 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
9 class Empty(Exception): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
10 "Exception raised by Queue.get(block=0)/get_nowait()." |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
11 pass |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
12 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
13 class Full(Exception): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
14 "Exception raised by Queue.put(block=0)/put_nowait()." |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
15 pass |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
16 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
17 class Queue: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
18 """Create a queue object with a given maximum size. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
19 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
20 If maxsize is <= 0, the queue size is infinite. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
21 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
22 def __init__(self, maxsize=0): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
23 try: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
24 import threading |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
25 except ImportError: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
26 import dummy_threading as threading |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
27 self._init(maxsize) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
28 # mutex must be held whenever the queue is mutating. All methods |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
29 # that acquire mutex must release it before returning. mutex |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
30 # is shared between the three conditions, so acquiring and |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
31 # releasing the conditions also acquires and releases mutex. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
32 self.mutex = threading.Lock() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
33 # Notify not_empty whenever an item is added to the queue; a |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
34 # thread waiting to get is notified then. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
35 self.not_empty = threading.Condition(self.mutex) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
36 # Notify not_full whenever an item is removed from the queue; |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
37 # a thread waiting to put is notified then. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
38 self.not_full = threading.Condition(self.mutex) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
39 # Notify all_tasks_done whenever the number of unfinished tasks |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
40 # drops to zero; thread waiting to join() is notified to resume |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
41 self.all_tasks_done = threading.Condition(self.mutex) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
42 self.unfinished_tasks = 0 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
43 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
44 def task_done(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
45 """Indicate that a formerly enqueued task is complete. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
46 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
47 Used by Queue consumer threads. For each get() used to fetch a task, |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
48 a subsequent call to task_done() tells the queue that the processing |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
49 on the task is complete. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
50 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
51 If a join() is currently blocking, it will resume when all items |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
52 have been processed (meaning that a task_done() call was received |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
53 for every item that had been put() into the queue). |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
54 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
55 Raises a ValueError if called more times than there were items |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
56 placed in the queue. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
57 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
58 self.all_tasks_done.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
59 try: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
60 unfinished = self.unfinished_tasks - 1 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
61 if unfinished <= 0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
62 if unfinished < 0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
63 raise ValueError('task_done() called too many times') |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
64 self.all_tasks_done.notifyAll() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
65 self.unfinished_tasks = unfinished |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
66 finally: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
67 self.all_tasks_done.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
68 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
69 def join(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
70 """Blocks until all items in the Queue have been gotten and processed. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
71 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
72 The count of unfinished tasks goes up whenever an item is added to the |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
73 queue. The count goes down whenever a consumer thread calls task_done() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
74 to indicate the item was retrieved and all work on it is complete. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
75 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
76 When the count of unfinished tasks drops to zero, join() unblocks. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
77 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
78 self.all_tasks_done.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
79 try: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
80 while self.unfinished_tasks: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
81 self.all_tasks_done.wait() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
82 finally: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
83 self.all_tasks_done.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
84 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
85 def qsize(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
86 """Return the approximate size of the queue (not reliable!).""" |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
87 self.mutex.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
88 n = self._qsize() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
89 self.mutex.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
90 return n |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
91 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
92 def empty(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
93 """Return True if the queue is empty, False otherwise (not reliable!).""" |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
94 self.mutex.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
95 n = self._empty() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
96 self.mutex.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
97 return n |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
98 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
99 def full(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
100 """Return True if the queue is full, False otherwise (not reliable!).""" |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
101 self.mutex.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
102 n = self._full() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
103 self.mutex.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
104 return n |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
105 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
106 def put(self, item, block=True, timeout=None): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
107 """Put an item into the queue. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
108 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
109 If optional args 'block' is true and 'timeout' is None (the default), |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
110 block if necessary until a free slot is available. If 'timeout' is |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
111 a positive number, it blocks at most 'timeout' seconds and raises |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
112 the Full exception if no free slot was available within that time. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
113 Otherwise ('block' is false), put an item on the queue if a free slot |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
114 is immediately available, else raise the Full exception ('timeout' |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
115 is ignored in that case). |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
116 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
117 self.not_full.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
118 try: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
119 if not block: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
120 if self._full(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
121 raise Full |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
122 elif timeout is None: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
123 while self._full(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
124 self.not_full.wait() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
125 else: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
126 if timeout < 0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
127 raise ValueError("'timeout' must be a positive number") |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
128 endtime = _time() + timeout |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
129 while self._full(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
130 remaining = endtime - _time() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
131 if remaining <= 0.0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
132 raise Full |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
133 self.not_full.wait(remaining) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
134 self._put(item) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
135 self.unfinished_tasks += 1 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
136 self.not_empty.notify() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
137 finally: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
138 self.not_full.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
139 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
140 def put_nowait(self, item): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
141 """Put an item into the queue without blocking. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
142 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
143 Only enqueue the item if a free slot is immediately available. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
144 Otherwise raise the Full exception. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
145 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
146 return self.put(item, False) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
147 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
148 def get(self, block=True, timeout=None): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
149 """Remove and return an item from the queue. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
150 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
151 If optional args 'block' is true and 'timeout' is None (the default), |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
152 block if necessary until an item is available. If 'timeout' is |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
153 a positive number, it blocks at most 'timeout' seconds and raises |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
154 the Empty exception if no item was available within that time. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
155 Otherwise ('block' is false), return an item if one is immediately |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
156 available, else raise the Empty exception ('timeout' is ignored |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
157 in that case). |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
158 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
159 self.not_empty.acquire() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
160 try: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
161 if not block: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
162 if self._empty(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
163 raise Empty |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
164 elif timeout is None: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
165 while self._empty(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
166 self.not_empty.wait() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
167 else: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
168 if timeout < 0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
169 raise ValueError("'timeout' must be a positive number") |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
170 endtime = _time() + timeout |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
171 while self._empty(): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
172 remaining = endtime - _time() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
173 if remaining <= 0.0: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
174 raise Empty |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
175 self.not_empty.wait(remaining) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
176 item = self._get() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
177 self.not_full.notify() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
178 return item |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
179 finally: |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
180 self.not_empty.release() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
181 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
182 def get_nowait(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
183 """Remove and return an item from the queue without blocking. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
184 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
185 Only get an item if one is immediately available. Otherwise |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
186 raise the Empty exception. |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
187 """ |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
188 return self.get(False) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
189 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
190 # Override these methods to implement other queue organizations |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
191 # (e.g. stack or priority queue). |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
192 # These will only be called with appropriate locks held |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
193 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
194 # Initialize the queue representation |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
195 def _init(self, maxsize): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
196 self.maxsize = maxsize |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
197 self.queue = deque() |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
198 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
199 def _qsize(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
200 return len(self.queue) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
201 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
202 # Check whether the queue is empty |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
203 def _empty(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
204 return not self.queue |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
205 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
206 # Check whether the queue is full |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
207 def _full(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
208 return self.maxsize > 0 and len(self.queue) == self.maxsize |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
209 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
210 # Put a new item in the queue |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
211 def _put(self, item): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
212 self.queue.append(item) |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
213 |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
214 # Get an item from the queue |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
215 def _get(self): |
|
f7ba151c33c6
add some missing svn properties to help with merges
Lenard Lindstrom <len-l@telus.net>
parents:
1167
diff
changeset
|
216 return self.queue.popleft() |
