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()