对Python线程池进行详细说明

CodeAsWind 2010-02-26

下面给大家总结一下自己总结的对Python线程池经验之谈,对于那些没有接触学习过编程语言或者多开发语言略懂的用户而言,Python语言绝对是最好的选择之一,并建议初学的程序员先从Python开始学习编程。

import Queue, threading, sys   


from threading import Thread   


import time,urllib   


# working thread   


class Worker(Thread):   



   worker_count = 0   




   def __init__( self, workQueue, resultQueue, timeout = 0, **kwds):   



       Thread.__init__( self, **kwds )   



       self.id = Worker.worker_count   



       Worker.worker_count += 1   


       self.setDaemon( True )   



       self.workQueue = workQueue   




       self.resultQueue = resultQueue   




       self.timeout = timeout   



       self.start( )   


   def run( self ):   


       ''' the get-some-work, do-some-work main loop of worker threads '''   


       while True:   


           try:   



               callable, args, kwds = self.workQueue.get(timeout=self.timeout)   




               res = callable(*args, **kwds)   



               print "worker[%2d]: %s" % (self.id, str(res) )   


               self.resultQueue.put( res )   


           except Queue.Empty:   


               break   


           except :   


               print 'worker[%2d]' % self.id, sys.exc_info()[:2]   


                  


class WorkerManager:   



   def __init__( self, num_of_workers=10, timeout = 1):   




       self.workQueue = Queue.Queue()   




       self.resultQueue = Queue.Queue()   




       self.workers = []   




       self.timeout = timeout   



       self._recruitThreads( num_of_workers )   


   def _recruitThreads( self, num_of_workers ):   


       for i in range( num_of_workers ):   



           worker = Worker( self.workQueue, self.resultQueue, self.timeout )   



           self.workers.append(worker)   


   def wait_for_complete( self):   


       # ...then, wait for each of them to terminate:   


       while len(self.workers):   



           worker = self.workers.pop()   



           worker.join( )   


           if worker.isAlive() and not self.workQueue.empty():   


               self.workers.append( worker )   


       print "All jobs are are completed."   


   def add_job( self, callable, *args, **kwds ):   


       self.workQueue.put( (callable, args, kwds) )   


   def get_result( self, *args, **kwds ):   


       return self.resultQueue.get( *args, **kwds )  

Worker类是一个Python线程池,不断地从workQueue队列中获取需要执行的任务,执行之,并将结果写入到resultQueue中。这里的workQueue和resultQueue都是现成安全的,其内部对各个线程的操作做了互斥。当从workQueue中获取任务超时,则线程结束。

相关推荐