簡體   English   中英

python中的無限while循環

[英]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條件被忽略了。

任何幫助和建議都將受到歡迎。 謝謝!

downloadGetlimit無限循環的一種可能原因是字符串對象。

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM