Angenommen, ich habe den folgenden Code:
from scipy import *
import multiprocessing as mp
num_cores = mp.cpu_count()
from joblib import Parallel, delayed
import matplotlib.pyplot as plt
def func(x,y):
return y/x
def main(y, xmin,xmax, dx):
x = arange(xmin,xmax,dx)
output = Parallel(n_jobs=num_cores)(delayed(func)(i, y) for i in x)
return x, asarray(output)
def demo():
x,z = main(2.,1.,30.,.1)
plt.plot(x,z, label='All values')
plt.plot(x[z>.1],z[z>.1], label='desired range') ## This is better to do in main()
plt.show()
demo()
Ich möchte die Ausgabe nur bis zur Ausgabe> einer bestimmten Zahl berechnen (es kann angenommen werden, dass die Ausgabeelemente mit zunehmender x monoton abnehmen) und dann anhalten (NICHT für alle Werte von x berechnen und dann sortieren, das ist für meinen Zweck ineffizient). Gibt es eine Möglichkeit, dies mit paralleler, verzögerter oder anderer Mehrfachverarbeitung zu tun?
python
python-3.x
python-multiprocessing
joblib
user247534
quelle
quelle
Antworten:
Es gab keine
output > a given number
Angabe, also habe ich mir nur eine ausgedacht. Nach dem Testen musste ich den Zustand für einen ordnungsgemäßen Betrieb umkehrenoutput < a given number
.Ich würde einen Pool verwenden, die Prozesse mit einer Rückruffunktion starten, um die Stoppbedingung zu überprüfen, und dann den Pool beenden, wenn er bereit ist. Dies würde jedoch zu einer Racebedingung führen, die es ermöglichen würde, Ergebnisse aus laufenden Prozessen wegzulassen, die nicht beendet werden durften. Ich denke, diese Methode hat nur minimale Änderungen an Ihrem Code und ist sehr einfach zu lesen. Die Reihenfolge der Liste ist NICHT garantiert.
Vorteile: sehr wenig Overhead
Nachteile: könnten fehlende Ergebnisse haben.
Methode 1)
Diese Methode hat mehr Overhead, ermöglicht jedoch Prozesse, deren Abschluss begonnen hat. Methode 2)
Methode 3) Vorteile: Es werden keine Ergebnisse ausgelassen.
Nachteile: Dieser Schritt geht weit über das hinaus, was Sie normalerweise tun würden.
nimm Methode 1 und füge hinzu
Dann ändern
stop_condition_callback
quelle
Ich würde Dask verwenden, um parallel auszuführen, und speziell die Futures- Schnittstelle für Echtzeit-Feedback der Ergebnisse, sobald sie abgeschlossen sind. Wenn Sie fertig sind, können Sie entweder die verbleibenden Futures im Flug stornieren, die nicht benötigten Futures leasen, um asynchron zu beenden, oder den Cluster schließen.
Anmerkungen: - Ich gehe davon aus, dass Sie "kleiner als" gemeint haben, da ansonsten der erste Wert bereits übergeben wird (
y / xmin > 0.1
). - Es wird nicht garantiert, dass die Ausgaben in der Reihenfolge vorliegen, in der Sie sie eingegeben haben, wenn Sie Ergebnisse abrufen möchten, sobald sie fertig sind, aber mit einer solchen schnelle Berechnung, vielleicht sind sie es immer (aus diesem Grund ließ ich die Funktion auch den Eingabewert zurückgeben) - wenn Sie aufhören zu rechnen, ist die Ausgabe kürzer als der gesamte Satz von Eingaben, daher bin ich mir nicht ganz sicher, was Sie wollen drucken.quelle