[英]Endless while loop in python
我目前正在使用urllib2在python2.7中編寫一個簡單的搜尋器。 這是下載程序類。
class Downloader:
def __init__(self, limit = 3):
self.limit = limit
def downloadGet(self, url):
request = urllib2.Request(url)
retry = 0
succ = False
page = None
while retry < self.limit:
print "Retry: " + str(retry) + " Limit:" + str(self.limit)
try:
response = urllib2.urlopen(request)
page = response.read()
succ = True
break
except:
retry += 1
return succ, page
每個網址都會嘗試三次。 也使用多線程,線程代碼如下:
class DownloadThread(Thread):
def __init__(self, requestGet, limit):
Thread.__init__(self)
self.requestGet = requestGet
self.downloader = Downloader(limit)
def run(self):
while True:
url = self.requestGet()
if url == None:
break
ret = self.download(url)
print ret
def download(self, url):
# some other staff
succ, flv = self.downloader.downloadGet(url)
return succ
但是,在將線程數設置為5的實驗過程中,嘗試3次后下載器不會停止。 對於某些線程,輸出甚至顯示“ Retry:4280 Limit:3”。 似乎while條件被忽略了。
任何幫助和建議都將受到歡迎。 謝謝!
downloadGet
: limit
無限循環的一種可能原因是字符串對象。
如果limit
是字符串,請retry < self.limit
yield在Python 2.x中為True
:
>>> retry = 4280
>>> limit = '3'
>>> retry < limit
True
檢查通過的limit
的類型。
如果URL不為空,則DownloadThread
代碼中沒有任何內容可以打破while循環。
您應該以更Python化的方式定義循環:
def downloadGet(self, url):
...
# do not declare retry before this
for retry in xrange(self.limit):
...
try:
編輯:
或者,您可以利用while
來比嘗試break
更清楚地處理循環狀態(盡管我覺得我的第一個示例不那么脆弱):
def downloadGt(self, url):
...
while retry in xrange(self.limit) or succ == False:
...
這具有更多自我記錄的好處。
雖然,我會考慮將循環重構為下載而不是下載器。 像這樣:
class DownloadThread(Thread):
...
def download(self, url):
for retry in xrange(self.downloader.limit):
succ, flv = self.downloader.downloadGet(url)
if succ:
return succ
class Downloader(object):
...
def downloadGet(self, url)
request = urllib2.Request(url)
try:
response = urllib2.urlopen(request)
page = response.read()
# always qualify your exception handlers
# or you may be masking errors you don't know about
except urllib2.HTTPError:
return False, None
return True, page
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.