use of Queue
Alexandru Mosoi
brtzsnr at gmail.com
Wed Aug 27 07:49:40 EDT 2008
On Aug 27, 1:06 pm, Gerhard Häring <g... at ghaering.de> wrote:
> Alexandru Mosoi wrote:
> > how is Queue intended to be used? I found the following code in python
> > manual, but I don't understand how to stop consumers after all items
> > have been produced. I tried different approaches but all of them
> > seemed incorrect (race, deadlock or duplicating queue functionality)
>
> > def worker():
> > while True:
> > item = q.get()
>
> if item is None:
> break
>
> > do_work(item)
> > q.task_done()
>
> > q = Queue()
> > for i in range(num_worker_threads):
> > t = Thread(target=worker)
> > t.setDaemon(True)
> > t.start()
>
> > for item in source():
> > q.put(item)
>
> # stop all consumers
> for i in range(num_worker_threads):
> q.put(None)
>
>
>
> > q.join() # block until all tasks are done
>
> This is how I do it.
>
> -- Gerhard
Your solution works assuming that you know how many consumer threads
you have :). I don't :). More than that, it's not correct if you have
more than one producer :). Having a sentinel was my very first idea,
but as you see... it's a race condition (there are cases in which not
all items are processed).
More information about the Python-list
mailing list