2010-11-01 3 views
0

Я реализовал некоторые потоки в проекте, над которым я работал в другом потоке, но комментарии и вопросы вышли из темы исходного сообщения, поэтому я решил, что лучше всего сделать новый вопрос. Проблема в этом. Я хочу, чтобы моя программа прекратила итерацию в течение цикла while после количества итераций, указанных в командной строке. Я передаю 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 

Кто-нибудь место, где я мог бы испортили, что w ould заставляет программу никогда не прекращать работу, и почему ссылки, которые уже были просканированы, не распознаются как таковые?

ответ

1

Вы фактически не передаете целое число 10 как maxsize. Вы проходите sys.argv[2]. sys.argv - список строк, поэтому в лучшем случае вы передаете "10" в качестве аргумента maxsize. И, к сожалению, в Python 2.x любое целое число меньше любой строки. Вероятно, вы, скорее всего, захотите использовать int(sys.argv[2]).

+0

Спасибо, останавливаясь, когда указано. Любая идея, почему ссылки просматриваются снова, даже если они помещены в список ссылок для игнорирования? – Stev0

Смежные вопросы