2010-11-01 96 views
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 

有誰那個地方我可能有搞砸了應該導致程序永遠不會停止運行,以及爲什麼已經被抓取的鏈接不被識別爲這樣?

回答

1

實際上,您並未將整數10作爲最大大小。您正在通過sys.argv[2]sys.argv是一個字符串列表,所以你最好通過"10"作爲maxsize參數。不幸的是,在Python 2.x中,任何整數都小於任何字符串。您可能想使用int(sys.argv[2])代替。

+0

謝謝,指定時停止。任何想法爲什麼鏈接被重新抓取,即使它們被放入要忽略的鏈接列表中? – Stev0 2010-11-01 04:51:34