0
我已經在另一個線程中對一個項目實施了一些線程,但是評論和問題已經逐漸脫離了原文的主題,所以我認爲最好的做法是提出一個新問題。問題是這樣的。我希望我的程序在命令行指定的迭代次數後停止迭代。我傳遞Queue.Queue(MAXSIZE = 10),在下面的代碼段:隊列(maxsize =)不工作?
THREAD_NUMBER = 5
def main():
queue = Queue.Queue(maxsize=sys.argv[2])
mal_urls = set(make_mal_list())
for i in xrange(THREAD_NUMBER):
crawler = Crawler(queue, mal_urls)
crawler.start()
queue.put(sys.argv[1])
queue.join()
這裏是運行功能:
class Crawler(threading.Thread):
def __init__(self, queue, mal_urls):
self.queue = queue
self.mal_list = mal_urls
self.crawled_links = []
threading.Thread.__init__(self)
def run(self):
while True:
self.crawled = set(self.crawled_links)
url = self.queue.get()
if url not in self.mal_list:
self.crawl(url)
else:
print("Malicious Link Found: {0}".format(url))
self.queue.task_done()
self.crawl是,做一些函數lxml.html解析,然後調用另一個函數,做一些字符串的鏈接處理使用LXML解析,然後調用self.queue.put(鏈接),像這樣:
def queue_links(self, link, url):
if link.startswith('/'):
link = "http://" + url.netloc + link
elif link.startswith("#"):
return
elif not link.startswith("http"):
link = "http://" + url.netloc + "/" + link
# Add urls extracted from the HTML text to the queue to fetch them
if link not in self.crawled:
self.queue.put(link)
else:
return
有誰那個地方我可能有搞砸了應該導致程序永遠不會停止運行,以及爲什麼已經被抓取的鏈接不被識別爲這樣?
謝謝,指定時停止。任何想法爲什麼鏈接被重新抓取,即使它們被放入要忽略的鏈接列表中? – Stev0 2010-11-01 04:51:34