J'ai implémenté des threads dans un projet sur lequel j'ai travaillé dans un autre thread, mais les commentaires et les questions ont évolué hors sujet du post original, donc j'ai pensé que la meilleure chose à faire était de faire une nouvelle question. Le problème est celui-ci. Je veux que mon programme arrête d'itérer sur une boucle while après une quantité d'itérations spécifiée par la ligne de commande. Je passe Queue.Queue (maxsize = 10), dans les segments de code suivants:La file d'attente (maxsize =) ne fonctionne pas?
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()
Et voici la fonction d'exécution:
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 est une fonction qui fait un peu l'analyse syntaxique de lxml.html et appelle ensuite une autre fonction qui fait une chaîne de manipulation avec les liens en utilisant lxml analysées et appelle ensuite self.queue.put (lien), comme suit:
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
Est-ce que quelqu'un spot où je pourrais avoir foiré que w Le programme devrait-il jamais s'arrêter de fonctionner, et pourquoi les liens qui ont déjà été explorés ne sont-ils pas reconnus comme tels?
Merci, en s'arrêtant lorsque spécifié. Une idée de pourquoi les liens sont à nouveau explorés même s'ils sont placés dans la liste des liens à ignorer? – Stev0