免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2455 | 回复: 2
打印 上一主题 下一主题

看了一个python线程池的代码产生的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-16 17:46 |只看该作者 |倒序浏览
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 )


问题在###的哪行, 那句代码是啥意思呢?如果一个线程join()返回了,那不就是这个线程结束了么?
为啥还要判断是不是Alive, 并且如果是还要放回到workers的列表中呢?这样放回去,难道这个已经结束的线程自己还能run起来?

论坛徽章:
0
2 [报告]
发表于 2010-07-17 22:42 |只看该作者
回复 1# lizhuohua
是不是漏掉了join的timeout参数?

论坛徽章:
0
3 [报告]
发表于 2010-07-19 13:55 |只看该作者
有道理,谢谢楼上的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP