2010-11-01 34 views
0

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?

Répondre

1

Vous ne passez pas réellement l'entier 10 comme taille maximale. Vous passez le sys.argv[2]. sys.argv est une liste de chaînes, donc au mieux vous passez "10" comme argument maxsize. Et malheureusement, dans Python 2.x, tout entier est inférieur à n'importe quelle chaîne. Vous voulez probablement utiliser int(sys.argv[2]) à la place.

+0

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