[Python-ideas] Queue suggestions
George Sakkis
george.sakkis at gmail.com
Fri May 23 07:23:54 CEST 2008
I'd like to propose a signature simplification and a new method for
the Queue.Queue class:
1) Drop the optional `block` argument from put() and get(), since all
the meaningful combinations of (block, timeout) are equivalent to
passing block = (timeout is None or timeout>0). IOW, instead of
passing block=False pass timeout=0 (or negative). Obviously this is to
be considered for 3.x only.
2) Add a new `rotate` method as the atomic equivalent of
put_nowait(get_nowait()). Currently I use the following subclass but
it would be nice to have it in the base Queue:
class RQueue(Queue):
def rotate(self, n=1):
'''Rotate this queue n steps to the left (if it is not empty).
Rotating one step is equivalent to an atomic
q.put_nowait(q.get_nowait()).
'''
if n < 0:
raise ValueError('n must be non-negative')
self.mutex.acquire()
try:
if not self._empty():
self._rotate(n)
finally:
self.mutex.release()
def __init__(self, maxsize=0):
Queue.__init__(self, maxsize)
if hasattr(self.queue, 'rotate'): # deque has rotate() since v2.5
def _rotate(n):
# negative n for left rotate
self.queue.rotate(-n)
else:
def _rotate(n):
put,get = self._put, self._get
for i in xrange(n):
put(get())
self._rotate = _rotate
What do you think ?
George
More information about the Python-ideas
mailing list