Welcome, guest | Sign In | My Account | Store | Cart
from Queue import Queue
from threading import Thread

class Worker(Thread):
   
"""Thread executing tasks from a given tasks queue"""
   
def __init__(self, tasks):
       
Thread.__init__(self)
       
self.tasks = tasks
       
self.daemon = True
       
self.start()
   
   
def run(self):
       
while True:
            func
, args, kargs = self.tasks.get()
           
try: func(*args, **kargs)
           
except Exception, e: print e
           
self.tasks.task_done()

class ThreadPool:
   
"""Pool of threads consuming tasks from a queue"""
   
def __init__(self, num_threads):
       
self.tasks = Queue(num_threads)
       
for _ in range(num_threads): Worker(self.tasks)

   
def add_task(self, func, *args, **kargs):
       
"""Add a task to the queue"""
       
self.tasks.put((func, args, kargs))

   
def wait_completion(self):
       
"""Wait for completion of all the tasks in the queue"""
       
self.tasks.join()

if __name__ == '__main__':
   
from random import randrange
    delays
= [randrange(1, 10) for i in range(100)]
   
   
from time import sleep
   
def wait_delay(d):
       
print 'sleeping for (%d)sec' % d
        sleep
(d)
   
   
# 1) Init a Thread pool with the desired number of threads
    pool
= ThreadPool(20)
   
   
for i, d in enumerate(delays):
       
# print the percentage of tasks placed in the queue
       
print '%.2f%c' % ((float(i)/float(len(delays)))*100.0,'%')
       
       
# 2) Add the task to the queue
        pool
.add_task(wait_delay, d)
   
   
# 3) Wait for completion
    pool
.wait_completion()

Diff to Previous Revision

--- revision 8 2010-04-12 22:25:38
+++ revision 9 2010-04-12 22:27:32
@@ -20,8 +20,7 @@
     
"""Pool of threads consuming tasks from a queue"""
     
def __init__(self, num_threads):
         
self.tasks = Queue(num_threads)
-        for _ in range(num_threads):
-            Worker(self.tasks)
+        for _ in range(num_threads): Worker(self.tasks)
 
     
def add_task(self, func, *args, **kargs):
         
"""Add a task to the queue"""

History