[Python-Dev] Another threading idea

Raymond Hettinger raymond.hettinger at verizon.net
Tue Mar 14 22:33:06 CET 2006


FWIW, I've been working on a way to simplify the use of queues with daemon 
consumer threads

Sometimes, I launch one or more consumer threads that wait for a task to enter a 
queue and then work on the task. A recurring problem is that I sometimes need to 
know if all of the tasks have been completed so I can exit or do something with 
the result.

If each thread only does a single task, I can use t.join() to wait until the 
task is done.  However, if the thread stays alive and waits for more Queue 
entries, then there doesn't seem to be a good way to tell when all the 
processing is done.

So, the idea is to create a subclass of Queue that increments a counter when 
objects are enqueued, that provides a method for worker threads to decrement the 
counter when the work is done, and offers a blocking join() method that waits 
until the counter is zero

   # main thread
   q = TaskQueue()
   for t in worker_threads():
       t.start()
   for task in tasklist:
       q.put(task)                  # increments the counter and enqueues a task
   q.join()                         # all of the tasks are done (counter is 
zero)
   do_work_on_results()



   # worker thread
   while 1:
         task = q.get()             # task is popped but the counter is 
unchanged
         do_work(task)
         q.decrement()              # now the counter gets reduced


The idea is still in its infancy (no implementation and it hasn't been tried in 
real-world code) but I would like to get some feedback.  If it works out, I'll 
post a recipe to ASPN and see how it goes.


Raymond 



More information about the Python-Dev mailing list