2016-08-08 33 views
5

Ich habe eine Liste der Bildpfade, die ich zwischen Prozessen oder Threads teilen möchte, so dass jeder Prozess einen Teil der Liste verarbeitet. Die Verarbeitung beinhaltet das Laden eines Bildes von der Platte, einige Berechnungen und das Ergebnis zurückgeben. Ich verwende Python 2.7 multiprocessing.PoolPython Multiprocessing Pool vs Multiprocessing ThreadPool

Hier ist, wie ich Arbeiter

def ProcessParallel(classifier,path): 
    files=glob.glob(path+"\*.png") 
    files_sorted=sorted(files,key=lambda file_name:int(file_name.split('--')[1])) 
    p = multiprocessing.Pool(processes=4,initializer=Initializer,initargs=(classifier,)) 
    data=p.map(LoadAndClassify, files_sorted) 
    return data 
erstellen

Das Problem verarbeitet ich konfrontiert bin, dass, wenn ich Initialisierungszeit in meiner Intializer Funktion einzuloggen, kam ich zu wissen, dass Arbeiter aren‘ t parallel initialisiert, sondern jeder Arbeiter mit einem Abstand von 5 Sekunden initialisiert wird, sind hier die Protokolle als Referenz

2016-08-08 12:38:32,043 - custom_logging - INFO - Worker started 
2016-08-08 12:38:37,647 - custom_logging - INFO - Worker started 
2016-08-08 12:38:43,187 - custom_logging - INFO - Worker started 
2016-08-08 12:38:48,634 - custom_logging - INFO - Worker started 

ich habe multiprocessing.pool.ThreadPool stattdessen versucht, mit der zugleich beginnt Arbeiter.
Ich weiß, wie Multiprocessing unter Windows funktioniert und wir müssen eine main guard platzieren, um unseren Code davor zu schützen, unendliche Prozesse zu erzeugen. Das Problem in meinem Fall ist, dass ich mein Skript auf IIS gehostet habe mit FASTCGI und mein Skript ist nicht Haupt, Es wird von der FastCGI-Prozess ausgeführt (Es gibt ein wfastcgi.py-Skript, das dafür verantwortlich ist). Jetzt gibt es in wfastcgi.py einen Hauptwächter und die Logs zeigen an, dass ich keine unendliche Anzahl von Prozessen erstelle.

Jetzt möchte ich wissen, dass das, was genau ist der Grund für Multiprozessing Pool nicht Worker-Threads zu schaffen gleichzeitig, ich werde wirklich jede Hilfe dankbar.

EDIT 1: Hier ist meine Initializer Funktion

def Initializer(classifier): 
    global indexing_classifier 
    logger.info('Worker started') 
    indexing_classifier=classifier 
+0

Was macht 'Initialisierer'? –

+0

Nur um die Zeit zu protokollieren, wenn ein Worker startet und eine Variable mit dem Namen 'Classifier' an jeden Worker zu übergeben – Ahmed

+0

@MuhammadTahir Bitte werfen Sie einen Blick auf die bearbeitete Frage – Ahmed

Antwort

0

ich viele Fragen versuchen zu laufen Multiprozessing unter cgi/wsgi, es funktioniert lokal, aber nicht auf realen webservers ... Letzten Endes nur hatte es isn nicht kompatibel. Wenn Sie Multiprocessing durchführen müssen, senden Sie asynchrone Jobs an etwas wie Sellery.