2010-11-01 82 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