2011-05-13 111 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尚未分配,並且在添加下一個流之前不會調用斷開連接。在調試器中嘗試此操作或添加更多打印輸出以驗證這一點。