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()方法並建立多個連接時,線程永遠不會關閉,運行循環似乎不會結束。
我確定我錯過了一些明顯的東西,但爲什麼它不能關閉流對象?