2011-05-13 8 views
2

urllib2를 사용하여 웹 소켓을 모니터링하고 있습니다. 내가 비동기 내 스트림 클래스의 인스턴스를 두 개 이상 실행할 수 있도록하려면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() 

: 나는 응답을 사이트에 연결 및 수신 처리하는 다음과 같은 클래스가 있습니다. 여기에 스트림의 인스턴스를 내 메인 클래스가 : 난 그냥 하나의 스트림 객체가있을 때 이것은 잘 작동하고, 스크립트가 정상적으로 종료

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

나는 _open_stream에서 전화했기 때문에 onStreamConnect에서 첫 프로듀서의 연결을 끊지 않을 것이라고 생각합니다. 이 시점에서 self.new_producer은 할당되지 않았으므로 다음 스트림이 추가 될 때까지 연결이 끊어지지 않습니다. 디버거에서 이것을 시험해 보거나 출력물을 더 추가하여이를 확인하십시오.

관련 문제