Ich verwende einen Python-Manager, um Daten zwischen Prozessen zu teilen. Ich wollte meinen Code in kleinere Teile aufteilen und erstellte eine Funktion 'soFactory', die ein Wörterbuch aus Name/Objekt-Paaren aufnehmen und das Objekt unter dem gegebenen Namen beim Manager registrieren würde. Im einfachen Beispiel unten erstelle ich zwei Listen und registriere sie beim Manager. Wenn ich soFactory verwende, gibt der Manager nur eine der Listen zurück (die letzte registriert), egal welchen Namen ich referenziere. Wenn ich die Logik von SoFactory entwirre, bekomme ich Zugriff auf das korrekte Objekt, indem ich ihre registrierten Namen verweise. Ich muss offensichtlich etwas vermissen, aber es nicht sehen.Python-Manager-Register-Problem oder nur mein fehlerhafter Code
# ------------ prototype for SO question -------
from sys import stderr
def soFactory(dictofSo, manager):
"""shared object factory"""
for n,t in dictofSo.items():
print >>stderr, 'created item',n,t
manager.register(n, callable=lambda: t)
def soRoutine(n, t, manager):
manager.register(n, callable=lambda: t)
def test_soFactory(useFactory=True):
"""tests the soFactory function"""
from multiprocessing import managers
m = managers.BaseManager(address='/var/tmp/tqps-test', authkey='abc123')
mySOlist = {'L1': [1],'L2':[2]}
if useFactory:
soFactory(mySOlist, m)
else:
for n, t in mySOlist.items():
soRoutine(n, t, m)
m.start()
m.L1().append('only in L1!')
print >>stderr, m.L1(), m.L2()
>>> test_soFactory()
created item L2 [2]
created item L1 [1]
[1, 'only in L1!'] [1, 'only in L1!']
>>> test_soFactory(useFactory=False)
[1, 'only in L1!'] [2]
>>>
Danke für die Erklärung, obwohl nicht eingängig macht es Sinn. –