Очередь (maxsize =) не работает? - PullRequest
0 голосов
/ 01 ноября 2010

Я реализовал некоторые потоки в проекте, над которым я работал, в другой ветке, но комментарии и вопросы отошли от темы исходного поста, поэтому я решил, что лучше всего сделать новый вопрос , Проблема в этом. Я хочу, чтобы моя программа перестала выполнять итерации в цикле while после количества итераций, указанного в командной строке. Я передаю Queue.Queue (maxsize = 10) в следующих сегментах кода:

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 (link), например, так:

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 Ответ

1 голос
/ 01 ноября 2010

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

...