2014-02-21 4 views
12

Im Moment habe ich dieses Stück Code (fühlen sich frei, sich dazu zu äußern auch :))Python Multiprocessing-Pool auf Windows 8.1 laicht nur ein Arbeiter

def threaded_convert_to_png(self): 
    paths = self.get_pages() 
    pool = Pool() 
    result = pool.map(convert_to_png, paths) 
    self.image_path = result 

auf einem Intel i7 es acht Arbeiter laicht, wenn unter Linux ; Wenn Windows 8.1 Pro ausgeführt wird, wird jedoch nur ein Worker erstellt. Ich überprüfte und cpu_count() gibt 8 auf Linux und Windows zurück.

  • Gibt es etwas, das ich hier vermisse oder falsch mache?
  • Gibt es eine Möglichkeit, dieses Problem zu beheben?

P.S. Dies ist in Python 2.7.6

+0

'Pool .__ init__' ruft' cpu_count' auf, um die Standardanzahl von Prozessen zu erhalten (siehe ['Lib/multiprocessing/pool.py' in Zeile 146] (http://hg.python.org/cpython/file/ 3a1db0d2747e/Lib/multiprocessing/pool.py # l146)). Außerdem ruft der '__init__' _repopulate_pool' in [Zeile 159] (http://hg.python.org/cpython/file/3a1db0d2747e/Lib/multiprocessing/pool.py#l159) auf, der eine Schleife in [Zeile 213] ausführt. (http://hg.python.org/cpython/file/3a1db0d2747e/Lib/multiprocessing/pool.py#l213), die die richtige Anzahl von 'Process'-Instanzen hervorbringt. Bist du sicher, dass nur ein Arbeiter spawnt? Wie überprüfen Sie die Anzahl der Arbeiter? – Bakuriu

+0

Ich bin sicher, weil ich nur einen zusätzlichen Python-Prozess sehe (und die Konvertierung dauert ewig). Ich habe sogar versucht, 'Pool (processes = 8)' zu übergeben, und wieder wurde nur ein Arbeiter erzeugt. – Drakkainen

+2

Versuchen Sie, ein [minimales vollständiges Codebeispiel zu erstellen, das Ihr Problem anzeigt] (http://stackoverflow.com/help/mcve). Verwenden Sie beispielsweise 'def f (Pfad): print path, mp.current_process()' anstelle von ' convert_to_png() 'und aktivieren Sie die Protokollierung' mp.log_to_stderr(). setLevel (logging.DEBUG) '. – jfs

Antwort

1

Es gibt einen einfachen Weg zu bestimmen, was in Ihrem Pool passiert - um Multiprocessing Debug zu aktivieren. Sie können es wie folgt tun:

import logging 
from multiprocessing import util 

util.log_to_stderr(level=logging.DEBUG) 

Und auf Skript ausgeführt werden Sie alle Infos über laufende Prozesse, Laichen und Aussteigen bekommen.

Wie auch immer, Prozess-Pool spawnen immer N Prozesse (wo ist N - "verarbeitet" Argument Wert oder cpu_count), aber Aufgaben Verteilung zwischen Prozessen kann ungleichmäßig sein - es hängt von der Laufzeit der Aufgabe.

1

Ich habe es geschafft, mein ähnliches Problem zu lösen. Ich bin mir nicht sicher, ob es für Sie hilfreich ist, aber ich habe beschlossen, es hier trotzdem zu dokumentieren, falls es jemandem hilft.

In meinem Fall analysierte ich eine riesige Menge an Tweets (insgesamt 52000), indem ich sie auf mehrere Prozessoren aufteilte. Es funktionierte gut auf OSX und auf dem Server, aber auf meinem Windows 8.1 war es wirklich langsam und Prozesse wurden nacheinander aktiviert. Als ich mir den Task-Manager genauer ansah, bemerkte ich, dass die Speicherauslastung des Haupt-Python-Prozesses auf etwa 1,5 GB anstieg. Die Speichernutzung des Arbeitsprozesses stieg ähnlich. Jetzt bemerkte ich, dass meine ältere Version gut funktionierte, die einen etwas anderen Algorithmus hatte. Am Ende war das Problem, dass ich ganze Tweets aus der Datenbank abgerufen habe, während ich nur den Textteil der Tweets benötigte. Dies führte offenbar zu einer erhöhten Speichernutzung. Nachdem ich diesen Teil repariert hatte, startete das Programm Worker-Prozesse ordnungsgemäß.

Basierend auf meiner Erfahrung habe ich eine Ahnung, dass Windows versucht, die RAM-Auslastung durch Blockieren der Worker-Prozesse zu steuern. Wenn ja, überprüfen Sie die RAM-Auslastung Ihrer Prozesse. Das ist nur Spekulation meinerseits, also interessiert mich, ob jemand eine bessere Erklärung hat.

Verwandte Themen