Queue enhancement suggestion

Peter Otten __peter__ at web.de
Mon Apr 16 03:07:18 EDT 2007


Paul Rubin wrote:

> I'd like to suggest adding a new operation
> 
>    Queue.finish()
> 
> This puts a special sentinel object on the queue.  The sentinel
> travels through the queue like any other object, however, when
> q.get() encounters the sentinel, it raises StopIteration instead
> of returning the sentinel.  It does not remove the sentinel from
> the queue, so further calls to q.get also raise StopIteration.
> That permits writing the typical "worker thread" as
> 
>    for item in iter(q.get): ...

I'd go one step further and implement Queue.__iter__(). The worker than
would do

for item in q: ...

> without having to mess with the task-counting stuff that recently got
> added to the Queue module.  The writing end of the queue simply
> calls .finish() when it's done adding items.
> 
> Someone in an earlier thread suggested
> 
>      # writing side
>      sentinel = object()
>      q.put(sentinel)
> 
>      ...
>      # reading side
>      for item in iter(q.get, sentinel): ...
> 
> however that actually pops the sentinel, so if there are a lot of
> readers then the writing side has to push a separate sentinel for
> each reader.  

I find that argument convincing.

Peter




More information about the Python-list mailing list