Dies ist wahrscheinlich eine triviale Frage, aber wie parallelisiere ich die folgende Schleife in Python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Ich weiß, wie man einzelne Threads in Python startet, aber ich weiß nicht, wie man die Ergebnisse "sammelt".
Auch mehrere Prozesse wären in Ordnung - was auch immer für diesen Fall am einfachsten ist. Ich verwende derzeit Linux, aber der Code sollte auch unter Windows und Mac ausgeführt werden.
Was ist der einfachste Weg, um diesen Code zu parallelisieren?
quelle
calc_stuff
?multiprocessing
Moduls für umfassendere Beispiele.Pool.map()
funktioniert im Grunde wiemap()
, aber parallel.Um eine einfache for-Schleife zu parallelisieren, bringt joblib viel Wert auf die rohe Verwendung von Multiprocessing. Nicht nur die kurze Syntax, sondern auch Dinge wie das transparente Bündeln von Iterationen, wenn diese sehr schnell sind (um den Overhead zu beseitigen) oder das Erfassen des Tracebacks des untergeordneten Prozesses, um eine bessere Fehlerberichterstattung zu erzielen.
Haftungsausschluss: Ich bin der ursprüngliche Autor von joblib.
quelle
Ich mag
concurrent.futures
das sehr, verfügbar in Python3 seit Version 3.2 - und über Backport auf 2.6 und 2.7 auf PyPi .Sie können Threads oder Prozesse verwenden und genau dieselbe Schnittstelle verwenden.
Mehrfachverarbeitung
Legen Sie dies in eine Datei - futuretest.py:
Und hier ist die Ausgabe:
Multithreading
Wechseln Sie nun
ProcessPoolExecutor
zuThreadPoolExecutor
und führen Sie das Modul erneut aus:Jetzt haben Sie sowohl Multithreading als auch Multiprocessing durchgeführt!
Hinweis zur Leistung und zur gemeinsamen Verwendung beider.
Die Stichprobe ist viel zu klein, um die Ergebnisse zu vergleichen.
Ich vermute jedoch, dass Multithreading schneller ist als Multiprocessing im Allgemeinen, insbesondere unter Windows, da Windows das Forking nicht unterstützt und jeder neue Prozess einige Zeit zum Starten benötigt. Unter Linux oder Mac werden sie wahrscheinlich näher sein.
Sie können mehrere Threads in mehreren Prozessen verschachteln. Es wird jedoch empfohlen, nicht mehrere Threads zu verwenden, um mehrere Prozesse auszulagern.
quelle
Das obige funktioniert wunderbar auf meinem Computer (Ubuntu, Paket joblib war vorinstalliert, kann aber über installiert werden
pip install joblib
).Genommen von https://blog.dominodatalab.com/simple-parallelization/
quelle
Die Verwendung von Ray bietet eine Reihe von Vorteilen :
In Ihrem Fall können Sie Ray starten und eine Remote-Funktion definieren
und rufen Sie es dann parallel auf
Um dasselbe Beispiel in einem Cluster auszuführen, würde sich nur der Aufruf von ray.init () ändern. Die entsprechende Dokumentation finden Sie hier .
Beachten Sie, dass ich bei der Entwicklung von Ray helfe.
quelle
Dies ist der einfachste Weg, dies zu tun!
Sie können Asyncio verwenden . (Dokumentation finden Sie hier ). Es wird als Grundlage für mehrere asynchrone Python-Frameworks verwendet, die leistungsstarke Netzwerk- und Webserver, Datenbankverbindungsbibliotheken, verteilte Aufgabenwarteschlangen usw. bereitstellen. Außerdem verfügt es über APIs auf hoher und niedriger Ebene, um alle Arten von Problemen zu bewältigen .
Jetzt wird diese Funktion bei jedem Aufruf parallel ausgeführt, ohne dass das Hauptprogramm in den Wartezustand versetzt wird. Sie können es auch zum Parallelisieren der for-Schleife verwenden. Wenn eine for-Schleife aufgerufen wird, ist die Schleife zwar sequentiell, aber jede Iteration läuft parallel zum Hauptprogramm, sobald der Interpreter dort ankommt. Zum Beispiel:
Dies erzeugt folgende Ausgabe:
quelle
wrapped()
und es sollte**kwargs
statt*kwargs
Warum verwenden Sie keine Threads und einen Mutex, um eine globale Liste zu schützen?
Denken Sie daran, Sie werden so schnell sein wie Ihr langsamster Thread
quelle
Ich fand
joblib
es sehr nützlich bei mir. Bitte sehen Sie folgendes Beispiel:n_jobs = -1: Alle verfügbaren Kerne verwenden
quelle
joblib
.Angenommen, wir haben eine asynchrone Funktion
Das muss auf einem großen Array ausgeführt werden. Einige Attribute werden an das Programm übergeben, andere werden von der Eigenschaft des Wörterbuchelements im Array verwendet.
quelle
Schau dir das an;
http://docs.python.org/library/queue.html
Dies ist vielleicht nicht der richtige Weg, aber ich würde so etwas tun.
Tatsächlicher Code;
Hoffentlich hilft das.
quelle
Dies kann nützlich sein, wenn Sie Multiprocessing und Parallel / Distributed Computing in Python implementieren.
YouTube-Tutorial zur Verwendung des Techila-Pakets
Techila ist eine verteilte Computing-Middleware, die mithilfe des Techila-Pakets direkt in Python integriert wird. Die Pfirsichfunktion im Paket kann beim Parallelisieren von Schleifenstrukturen hilfreich sein. (Das folgende Code-Snippet stammt aus den Techila Community-Foren. )
quelle
danke @iuryxavier
quelle
sehr einfaches Beispiel für Parallelverarbeitung ist
quelle