Warum endet mein Multiprozess-Python-Skript nie?

Ich versuche einige Multiprozess-Beispiele, vor allem: http://toastdriven.com/blog/2008/nov/11/brief-introduction-multiprocessing/ wo ich die "einfache Anwendung" genommen habe, die Multiprozess verwenden, um URLs zu testen. Wenn ich es (in Python 3.3, auf Windows in PyCharm IDE) mit einigen Modifikationen, mit vielen URLs, mein Skript nie aufhören, und ich sehe nicht, warum.

import httplib2 import sys from multiprocessing import Lock, Process, Queue, current_process def worker(work_queue, done_queue): for url in iter(work_queue.get, 'STOP'): try: print("In : %s - %s." % (current_process().name, url)) status_code = print_site_status(url) done_queue.put("%s - %s got %s." % (current_process().name, url, status_code)) except: done_queue.put("%s failed on %s with: %s" % (current_process().name, url, str(sys.exc_info()[0]))) print("Out : %s " % (current_process().name)) return True def print_site_status(url): http = httplib2.Http(timeout=10) headers, content = http.request(url) return headers.get('status', 'no response') def main(): workers = 8 work_queue = Queue() done_queue = Queue() processes = [] with open("Annu.txt") as f: # file with URLs lines = f.read().splitlines() for surl in lines: work_queue.put(surl) for w in range(workers): p = Process(target=worker, args=(work_queue, done_queue)) p.start() processes.append(p) work_queue.put('STOP') for p in processes: p.join() print("END") done_queue.put('STOP') for status in iter(done_queue.get, 'STOP'): print(status) if __name__ == '__main__': main() 

Ich sehe alle URLs Status getestet, und alle Prozess 'Out' Nachricht, die hte Ende des Prozesses, aber nie meine 'END' Nachricht. Eine Liste von URLs, die ich verwende, ist: http://www.pastebin.ca/2946850 .

Also … wo ist mein Fehler? Ist es ein Duplikat mit: Python Multiprocessing Threads nie beitreten, wenn gegeben große Mengen an Arbeit ?

Einige Informationen: Wenn ich 'done_queue' überall im Code unterdrücke: Es ist funktioniert.

2 Solutions collect form web for “Warum endet mein Multiprozess-Python-Skript nie?”

Aus der Queue Dokumentation :

Wenn der optionale Args-Block wahr ist und das Timeout keine (die Standardeinstellung) ist, ggf. blockieren, bis ein Element verfügbar ist.

Das bedeutet, dass deine Loops niemals enden.

Sie müssen entweder ein Timeout hinzufügen, um das zu get und die Schleife zu stoppen, wenn Sie die Empty Ausnahme erhalten oder Sie müssen die Schleife beenden, wenn Sie die STOP Nachricht erhalten.

OK, fand ich die Antwort (im Python doc: https://docs.python.org/3.4/library/multiprocessing.html#multiprocessing-programming ):

Warnung Wie oben erwähnt, wenn ein Kind-Prozess Elemente in eine Warteschlange gesetzt hat (und es hat nicht verwendet JoinableQueue.cancel_join_thread), dann wird dieser Prozess nicht beenden, bis alle gepufferten Elemente wurden in die Pipe gespült.

So ändern Sie den Code:

  print("Out : %s " % (current_process().name)) return True 

Durch :

  print("Out : %s " % (current_process().name)) done_queue.cancel_join_thread() return True 

Ich verstehe nicht, warum der Anfangscode mit einer kleinen Anzahl von URLs arbeitet …

  • Installieren von scipy in Python 3.5 auf 32-Bit-Windows 7-Maschine
  • Wie man die Bisection-Methode in Python macht
  • Python Interactive Shell - SyntaxError mit Druck
  • Die eingebaute API-Django-Dokumentation zeigt nichts an
  • Rufen Sie eine Python-Datei in einem SML-Programm an?
  • Entfernen Sie die neue Zeile "\ n" aus base64 codierten Zeichenfolgen in Python3?
  • Wie gibt Python mehrere Werte aus einer Funktion zurück?
  • Rundung schwimmt, so dass sie genau zu summieren
  • Python: Unterschiedliche Ergebnisse bei der Verwendung von PyCharm und IDLE / python
  • Izip funktioniert nicht in Python 3.x
  • Tauschen der ersten und letzten Elemente in einer Liste
  • Python ist die beste Programmiersprache der Welt.