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 …

  • Pip oder pip3, um Pakete für Python 3 zu installieren?
  • Warum Druck in Python nicht pausieren, wenn mit Schlaf in einer Schleife?
  • Planen Sie Python Script, um jede Stunde genau zu laufen
  • Warum bekomme ich "python int zu groß, um in C lange" Fehler umzuwandeln, wenn ich matplotlibs DateFormatter zum Formatieren von Datumsangaben auf der x-Achse verwende?
  • Probleme beim Ausführen von Python 32 in Sublime Text 2
  • Tensorflow: Wiederherstellen eines Graphen und Modells, dann Auswertung auf einem einzelnen Bild ausführen
  • Testing Äquivalenz von xml.etree.ElementTree
  • Wie bekomme ich bei der Aufnahme von SIGUSR2 / SIGINT Stdout von Subprocess in Python
  • PyQt Class funktioniert nicht für den zweiten Gebrauch
  • Wie installiere ich pip3 unter Windows?
  • Umweltpfad zu Python funktioniert nicht?
  • Python ist die beste Programmiersprache der Welt.