Code: Alles auswählen
"""The synchronized Queue from the standard lib with a peek method"""
import Queue
class PQueue(Queue.Queue):
def peek(self, block=True, timeout=None):
"""Return but do not remove an item from the queue.
If optional args 'block' is true and 'timeout' is None (the default),
block if necessary until an item is available. If 'timeout' is
a positive number, it blocks at most 'timeout' seconds and raises
the Empty exception if no item was available within that time.
Otherwise ('block' is false), return an item if one is immediately
available, else raise the Empty exception ('timeout' is ignored
in that case).
"""
self.not_empty.acquire()
try:
if not block:
if self._empty():
raise Empty
elif timeout is None:
while self._empty():
self.not_empty.wait()
else:
if timeout < 0:
raise ValueError("'timeout' must be a positive number")
endtime = _time() + timeout
while self._empty():
remaining = endtime - _time()
if remaining <= 0.0:
raise Empty
self.not_empty.wait(remaining)
item = self._peek()
self.not_full.notify()
return item
finally:
self.not_empty.release()
def _peek(self):
return self.queue[0]
es wird also die kontrolle nach dem lesen des ersten elements wieder abgegeben.
wie bei get().
wenn man also weiss, dass das erste element das richtige ist, stellt man sich wieder an zum poppen.
das setzt leider vorraus, dass kein anderer dieses element weg nimmt.
alternative wäre die kontrolle nach dem peek nicht abzugeben, aber das widerspricht der philosophie von Queue.
eine andere möglichkeit wäre ein get_if das get nur ausführt wenn eine übergebene expression wahr ist. naja.
jemand ne bessere idee?