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