4 Stimmen

Beenden des Lebens eines Threads in Python?

Ich habe den untenstehenden Code, aber er läuft weiter, nachdem die Warteschlange leer ist. Irgendwelche Einblicke:

def processor():
   while(1>0):
    if queue.empty() == True:  
    print "the Queue is empty!"  
    break
   source=queue.get()
   page = urllib2.urlopen(source)
   print page   

def main:
   for i in range(threads):  
    th = Thread(target=processor)  
    th.setDaemon(True)  
    th.start()  
   queue.join()  

Es druckt "Warteschlange leer" so oft aus, wie ich Threads habe, und steht einfach da und tut nichts.

6 Stimmen

Bitte beheben Sie die Einrückung und posten Sie ein vollständiges Beispiel.

5voto

Thiago Chaves Punkte 8749

Sie müssen queue.task_done() aufrufen, nachdem Sie die Seite gedruckt haben, da andernfalls join() blockiert wird. Jeder Thread muss nach Verwendung von get() task_done() aufrufen.

Siehe Dokumentation für die Warteschlange

3voto

vartec Punkte 124396

Dieser Teil:

   while(1>0):
    if queue.empty() == True:  
    print "the Queue is empty!"  
    break

Oben ist einfach falsch. queue.get() ist blockierend, es gibt absolut keinen Grund, eine Endlosschleife zu haben. Sie sollte gelöscht werden.

Ihr Code sollte etwa so aussehen.

def processor():
   source=queue.get()
   page = urllib2.urlopen(source)
   print page   
   queue.task_done()

def main:
   for i in range(threads):  
    th = Thread(target=processor)  
    th.setDaemon(True)  
    th.start()  
   for source in all_sources:
    queue.put(source)
   queue.join()  

Es ist nicht der sauberste Weg, um zu beenden, aber es wird funktionieren. Da die Processor-Threads als Daemons festgelegt sind, wird der gesamte Prozess beendet, sobald die main abgeschlossen ist.

1voto

Jacinda Punkte 4612

Wie Max sagte, brauchen wir ein vollständiges Beispiel, um mit Ihrem Verhalten zu helfen, aber aus der Dokumentation:

Die Thread-Klasse von Python unterstützt eine Teilmenge des Verhaltens der Thread-Klasse von Java; derzeit gibt es keine Prioritäten, keine Thread-Gruppen und Threads können nicht zerstört, gestoppt, angehalten, fortgesetzt oder unterbrochen werden.

Es hört auf zu leben, wenn seine Methode run() terminiert - entweder normal oder durch das Werfen einer unbehandelten Ausnahme. Die Methode is_alive() testet, ob der Thread lebt.

http://docs.python.org/library/threading.html

Das thread-Modul auf niedrigerer Ebene ermöglicht es Ihnen, exit() manuell aufzurufen. Ohne ein vollständigeres Beispiel weiß ich nicht, ob das in diesem Fall das ist, was Sie brauchen, aber ich vermute nicht, da Thread-Objekte automatisch enden sollten, wenn run() abgeschlossen ist.

http://docs.python.org/library/thread.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X