Producer-consumer threading problem

giltay at gmail.com giltay at gmail.com
Wed Jun 11 09:48:03 EDT 2008


> Sounds like a sentinel would work for this.  The producer puts a
> specific object (say, None) in the queue and the consumer checks for
> this object and stops consuming when it sees it.  But that seems so
> obvious I suspect there's something else up.

     There's a decent implementation of this in the Python Cookbook,
Second Edition (9.4: Working with a Thread Pool), available from
Safari as a preview:
http://my.safaribooksonline.com/0596007973/pythoncook2-CHP-9-SECT-4

     Basically, there's a request_work function that adds (command,
data) pairs to the input Queue.  The command 'stop' is used to
terminate each worker thread (there's the sentinel).
stop_and_free_thread_pool() just puts N ('stop', None) pairs and
join()s each thread.

     The threadpool put()s the consumed items in an output Queue; they
can be retrieved concurrently using get().  You don't call join()
until you want to stop producing; you can get() at any time.

Geoff Gilmour-Taylor

(I ended up using this recipe in my own code, but with a completely
different stopping mechanism---I'm using the worker threads to control
subprocesses; I want to terminate the subprocesses but keep the worker
threads running---and a callback rather than an output queue.)



More information about the Python-list mailing list