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() 메서드를 호출하고 둘 이상의 연결을 설정하면 스레드가 닫히지 않고 실행 루프가 종료 된 것처럼 보이지 않습니다.
분명히 뭔가 빠졌지 만 스트림 개체를 종료 할 수없는 이유는 무엇입니까?