Ich habe mich für den Anfang nun für:
multiprocessing.Mananger.dict()
entschieden.
Auf die Weise werde ich Informationen zwischen mehreren Processen synchron halten.
Bei jedem Zugriff/Änderung werde ich ein multiprocessing lock verwenden.
Da ich Python 3.4 verwende, ist mir schon aufgefallen, dass man um das manager dict synchron zu verändern, einen kleinen Trick braucht (ab 3.6 wohl nicht mehr).
Schematisches Beispiel:
Code: Alles auswählen
mgr = multiprocessing.Manager()
d = mgr.dict()
d = {"meineDaten":{"liste1":[1,2]}}
# synchron über alle Prozesse den 2ten eintrag der liste auf eine 3 ändern:
_d = d["meineDaten"] # in lokaler variable speichern
_d["liste1"][1] = 3 # änderungen nach belieben vornehmen
d["meineDaten"] = _d # updaten
Nun zu meiner Frage:
Ich würde gerne, dass ich 1 Prozess habe, welcher zb via API alle paar Sekunden Daten abfragt und das Ergebnis in self. Variablen abspeichert (allerdings simultan von mehreren websiten, weshalb dadurch im extremfall alle zb 0.01 sek neue daten eingehen). Anstatt diese Daten nun im 0.01 sekundentakt oder häufiger für alle prozesse zu synchronisieren, würde ich diesen Synchronisationsprozess lieber auf Abruf starten. So nach dem Motto "Prozess 2 braucht nun folgende Daten, schick sie mir mal bitte". Denn dies wird deutlich seltener als alle 0.01 sekunden oderso nötig sein, vllt alle 5 sekunden.
Wie mache ich das am geschicktesten?
Mir ist aufgefallen, dass ich sogar ganze self. Funktionen in so ein synchron gehaltenes dictionary packen kann.
Ich dachte so könnte ich das "auf Abruf" realisieren.Allerdings hab ich auch schon gemerkt, dass diese Funktionen, wenn ich sie im anderen Prozess dann aufrufe, mit den self. Werten arbeiten, die gültig waren, als die Funktion in das dictionary gepackt wurde. Letzlich würde das also nur heißen, anstatt alle 0.01 sek ein bestimmtes dictionary zu synchroniseren, müsste ich alle 0.01 sekunden die Funktion synchronisieren, was vermutlich bedeutet, dass gleichzeitig ALLE self. Variablen mit abgespeichert werden? Demnach ist das wohl nicht zu empfehlen, wenn ich nur bestimmte und nicht alle self. Werte brauche, oder?
Ein anderer Weg wäre die relevanten Daten nur zu synchronisieren, wenn quasi eine Aufforderung vom anderen Prozess in Form eines zusätzlichen manager dicts eingeht. Das manager dict enthält dann nur sowas wie "braucheDaten":True und wird alle 0.01 sekunden gecheckt. Wenn der Wert True ist, werden die Daten synchronisiert und gut ist. Auf die Weise haben wir zwar wieder diesen 0.01 sekunden Abstand, aber anstatt in diesem Abstand ständig alle Daten zu synchronisieren, wird nur dieses Hilfs-dictionary synchron gehalten.
Also nochmal der Aufbau:
Ein "Haupt"-Prozess, welcher alle möglichen Daten von APIs abruft und in self. Variablen speichert.
Viele (bis zu 100 oder mehr, aber für den Anfang eher 10) weitere Prozesse, die sich ganz bestimmte dieser Daten vom Haupt-prozess holen, jeweils zb alle 5-10 sekunden.
Der Aufbau ist deshalb so gewählt, weil zb jeweils 10 von 100 dieser Prozesse dieselben Daten brauchen, es macht also keinen Sinn, dass alle 10 unabhängig voneinander dieselben Daten via API abfragen (auch schon wegen des API Call Limits)