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.Pool
Python 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
Was macht 'Initialisierer'? –
Nur um die Zeit zu protokollieren, wenn ein Worker startet und eine Variable mit dem Namen 'Classifier' an jeden Worker zu übergeben – Ahmed
@MuhammadTahir Bitte werfen Sie einen Blick auf die bearbeitete Frage – Ahmed