1 # A multi-producer, multi-consumer queue.
3 Empty
= 'Queue.Empty' # Exception raised by get_nowait()
7 # Initialize a queue object with a given maximum size
8 # (If maxsize is <= 0, the maximum size is infinite)
9 def __init__(self
, maxsize
):
11 self
.mutex
= thread
.allocate_lock()
12 self
.esema
= thread
.allocate_lock()
13 self
.esema
.acquire_lock()
14 self
.fsema
= thread
.allocate_lock()
16 # Get an approximation of the queue size (not reliable!)
18 self
.mutex
.acquire_lock()
20 self
.mutex
.release_lock()
23 # Check if the queue is empty (not reliable!)
25 self
.mutex
.acquire_lock()
27 self
.mutex
.release_lock()
30 # Check if the queue is full (not reliable!)
32 self
.mutex
.acquire_lock()
34 self
.mutex
.release_lock()
37 # Put a new item into the queue
39 self
.fsema
.acquire_lock()
40 self
.mutex
.acquire_lock()
41 was_empty
= self
._empty
()
44 self
.esema
.release_lock()
46 self
.fsema
.release_lock()
47 self
.mutex
.release_lock()
49 # Get an item from the queue,
50 # blocking if necessary until one is available
52 self
.esema
.acquire_lock()
53 self
.mutex
.acquire_lock()
54 was_full
= self
._full
()
57 self
.fsema
.release_lock()
59 self
.esema
.release_lock()
60 self
.mutex
.release_lock()
63 # Get an item from the queue if one is immediately available,
64 # raise Empty if the queue is empty or temporarily unavailable
66 locked
= self
.esema
.acquire_lock(0)
67 self
.mutex
.acquire_lock()
69 # The queue is empyt -- we can't have esema
70 self
.mutex
.release_lock()
73 locked
= self
.esema
.acquire_lock(0)
75 # Somebody else has esema
76 # but we have mutex --
78 self
.mutex
.release_lock()
80 was_full
= self
._full
()
83 self
.fsema
.release_lock()
85 self
.esema
.release_lock()
86 self
.mutex
.release_lock()
89 # XXX Need to define put_nowait() as well.
92 # Override these methods to implement other queue organizations
93 # (e.g. stack or priority queue).
94 # These will only be called with appropriate locks held
96 # Initialize the queue representation
97 def _init(self
, maxsize
):
98 self
.maxsize
= maxsize
102 return len(self
.queue
)
104 # Check wheter the queue is empty
106 return not self
.queue
108 # Check whether the queue is full
110 return self
.maxsize
> 0 and len(self
.queue
) == self
.maxsize
112 # Put a new item in the queue
113 def _put(self
, item
):
114 self
.queue
.append(item
)
116 # Get an item from the queue