map_async vs apply_async:was sollte ich in diesem Fall
Ich bin Bearbeitung von ascii-Daten, einige Vorgänge, und dann schreiben Sie alles wieder in eine andere Datei (Arbeit post_processing_0.main
, ohne dass etwas zurückgegeben). Ich möchte zum parallelisieren des Codes mit dem multiprocessing-Modul finden Sie in den folgenden code-snippet:
from multiprocessing import Pool
import post_processing_0
def chunks(lst,n):
return [ lst[i::n] for i in xrange(n) ]
def main():
pool = Pool(processes=proc_num)
P={}
for i in range(0,proc_num):
P['process_'+str(i)]=pool.apply_async(post_processing_0.main, [split_list[i]])
pool.close()
pool.join()
proc_num=8
timesteps=100
list_to_do=range(0,timesteps)
split_list=chunks(list_to_do,proc_num)
main()
Las ich den Unterschied zwischen map und async, aber ich don t verstehen es sehr gut. Ist meine Bewerbung des multiprocessing-Modul korrekt?
In diesem Fall, sollte ich map_async oder apply_async? Und warum?
Edit:
Ich glaube nicht, dass dies ist ein Duplikat der Frage Python-multiprocessing.Pool: Zeitpunkt der Verwendung gelten, apply_async oder Karte?. In der Frage, die Antwort den Fokus auf die Reihenfolge der Ergebnis, dass unter Verwendung der beiden Funktionen. Hier Frage ich: was ist der Unterschied, wenn nichts zurückgegeben wird?
- möglich, Duplikat der Python-multiprocessing.Pool: Zeitpunkt der Verwendung gelten, apply_async oder Karte?
- Ich lese diese Frage, aber es nicht klar, meine Zweifel. Ich fordere eine strengere Frage: was ist der Unterschied in diesem Fall, wo kein Ergebnis, parallelisierte Funktion zurückgegeben wird ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen
map_async
aus drei Gründen:Es ist sauberer code suchen. Diese:
sieht besser aus als das hier:
Mit
apply_async
, wenn eine Ausnahme Auftritt innen derpost_processing_0.main
Sie nicht wissen, über es sei denn, Sie explizit zu nennenP['process_x'].get()
auf die fehlerhafteAsyncResult
Objekt, die erfordern würde, der Iteration über alleP
. Mitmap_async
die exception wird ausgelöst, wenn Sie anrufenasync_result.get()
- keine iteration erforderlich.map_async
gebaut hat-in chunking-Funktionalität, um Ihren code ausführen merklich besser, wennsplit_list
ist sehr groß.Andere als das, das Verhalten ist im Grunde das gleiche, wenn Sie kümmern sich nicht um die Ergebnisse.
apply_async
muss nur einen Auftrag an den pool.map_async
legt mehrere Aufträge ruft die gleiche Funktion mit unterschiedlichen Argumenten. Der ehemalige nimmt eine Funktion plus argument-Liste; der letztere übernimmt eine Funktion plus iterierbar (dh Sequenz) repräsentiert die Argumente.map_async
nur nennen kann unäre Funktionen (d.h. Funktionen nehmen ein einzelnes argument).In deinem Fall könnte es besser sein, die Umstrukturierung der code leicht auf alle Ihre Argumente in eine einzige Liste und nur call
map_async
einmal mit, dass die Liste.map_async
nur nennen kann unäre Funktionen.