2011-05-13 115 views
2

我正在使用urllib2监视Web套接字。我有以下的类,它处理连接到该网站,并接收响应:Python - 问题关闭线程

class Stream(Thread): 

    def __init__(self, connectCallback=None, **kwargs): 
     self.connectCallback = connectCallback 
     Thread.__init__(self) 

    def run(self): 
     self.running = True 

     while self.running: 
      try: 
       req = urllib2.Request(url, headers=self.headers) 
       req.add_data(self.body) 
       print "Stream connecting %s" % self 
       self.connectCallback(self) 
       f = urllib2.urlopen(req) 
       print "Stream connected %s" % self 
       while 1: 
        if self.running: 
         print "data receiving" 
        else: 
         f.close() 
         break 
       retry_time = self.retry_time 
      except (urllib2.URLError, urllib2.HTTPError), e: 
       print 'Exception: %s, retry in %f' % (e, retry_time) 
       time.sleep(retry_time) 
       retry_time *= 4.0 
       if retry_time > self.max_retry: 
        retry_time = self.max_retry 
      except Exception as err: 
       print 'Exception: %s' % err 

     print "Stream closed %s" % self 

    def disconnect(self): 
     print 'Disconnecting stream %s ' % self 
     if self.running is False: 
      return 
     self.running = False 
     self.join() 

我希望能够异步运行我的Stream类的多个实例。这里是一个实例化流我的主类:

class Consumer(object): 

    def __init__(self): 
     try: 
      self.producer = self._open_stream() 
      while 1: 
       sleep(100) 
     except KeyboardInterrupt: 
      self.producer.disconnect() 
      sys.exit() 

    def onStreamConnect(self, instance): 
     print "STREAM CONNECTED %s " % instance 
     if getattr(self, 'new_producer', None): 
      self.producer.disconnect() 
     self.producer = instance 

    def onTrackChange(self): 
     print "TRACKS UPDATED" 
     self.new_producer = self._open_stream() 

    def _open_stream(self): 
     s = Stream(onStreamConnect) 
     s.start() 
     return s 

if __name__ == "__main__": 
    c = Consumer() 

这个伟大的工程的时候我只有一个流对象,脚本会干净地关闭。然而,当我打电话给我的onTrackChange()方法并建立多个连接时,线程永远不会关闭,运行循环似乎不会结束。

我确定我错过了一些明显的东西,但为什么它不能关闭流对象?

回答

0

我相信你没有断开你的第一个生产者onStreamConnect,因为它被称为_open_stream。此时self.new_producer尚未分配,并且在添加下一个流之前不会调用断开连接。在调试器中尝试此操作或添加更多打印输出以验证这一点。