threads or queue for this task

Mark Hammond mhammond at skippinet.com.au
Sat Sep 14 04:24:06 EDT 2002


robin at execulink.com wrote:
> I am missing something I think with the difference between the
> threading and Queue modules. These could really do with some updated
> docs with examples.
> 
> I wish to have a server continually cycle (until interrupted by
> keyboard, signal, or whatever). It needs to perform several (say 6)
> different tasks, each of which may take significantly different
> lengths of time to perform.
> 
> My first implementation used threading.py. I wrote a dispatcher to
> start each of the threads, and then wait until the thread count was
> back down to 1. This I put in a while loop, and surrounded it with the
> necessary exception code.
> 
> Each cycle through the while has to wait for the slowest process to
> finish before completing. During this time, the other processes just
> sit around doing nothing. What I really want is for each process to
> start up again when they are done, so that there are no more than 6
> going at once. In other words, I want to be sure I don't start a new
> process 3 before the old process 3 is done.
> 
> I have looked at Queue but it doesn't seem to have enough control to
> make this happen.
> 
> I am sure I am overlooking something obvious. Thanks ahead of time for
> any help!

It is common for threading code to look somewhat like:

threads = []
for i in range(number_of_tasks):
   thread.append(thread_for_task)
# let the threads run - just wait for shutdown
for t in threads:
   t.join()

Each thread itself contains a loop which continually look for more work 
to do, or exit.  The queue module is useful for giving threads work to 
do - some other thread can queue new things, and the worker thread 
removes them, blocking while nothing is in the queue.

Look for Aahz's threading tutorial - URL not at hand, but it can't be 
too hard to find.  Indeed, I predict he will tell you exactly where it is ;)

Hope this helps,

Mark.




More information about the Python-list mailing list