Multiprocessing.Queue - I want to end.

Cameron Simpson cs at zip.com.au
Fri May 1 01:22:26 EDT 2009


On 01May2009 08:37, I wrote:
| On 30Apr2009 22:57, MRAB <google at mrabarnett.plus.com> wrote:
| > The producer could send just one None to indicate that it has finished
| > producing.
| > Each consumer could get the data from the queue, but if it's None then
| > put it back in the queue for the other consumer, then clean up and
| > finish.
| > When all the consumers have finished, the queue will contain just the
| > single None.
| 
| And as it happens I have an IterableQueue class right here which does
| _exact_ what was just described. You're welcome to it if you like.
| Added bonus is that, as the name suggests, you can use the class as
| an iterator:
|   for item in iterq:
|     ...
| The producer calls iterq.close() when it's done.

Someone asked, so code appended below.

Cameron Simpson <cs at zip.com.au> DoD#743
http://www.cskk.ezoshosting.com/cs/

class IterableQueue(Queue): 
  ''' A Queue obeying the iterator protocol.
      Note: Iteration stops when a None comes off the Queue.
  '''

  def __init__(self, *args, **kw):
    ''' Initialise the queue.
    '''
    Queue.__init__(self, *args, **kw)
    self.__closed=False

  def put(self, item, *args, **kw):
    ''' Put an item on the queue.
    '''
    assert not self.__closed, "put() on closed IterableQueue"
    assert item is not None, "put(None) on IterableQueue"
    return Queue.put(self, item, *args, **kw)

  def _closeAtExit(self):
    if not self.__closed:
      self.close()

  def close(self):
    ##logFnLine("%s.close()"%(self,),frame=sys._getframe(1))
    if self.__closed:
      # this should be a real log message
      print >>sys.stderr, "close() on closed IterableQueue"
    else:
      self.__closed=True
      Queue.put(self,None)

  def __iter__(self):
    ''' Iterable interface for the queue.
    '''
    return self

  def next(self):
    item=self.get()
    if item is None:
      Queue.put(self,None)      # for another iterator
      raise StopIteration
    return item



More information about the Python-list mailing list