2017-11-05 11 views
0

Ich habe einen Manager mit einem Diktat-Proxy. Ich möchte von einem anderen Prozess aus darauf zugreifen. Der Kürze halber verwendet der Beispielcode nur einen Prozess, nimmt jedoch an, dass wir keinen direkten Verweis darauf haben (als ob der andere Prozess aus dem ersten erstellt wurde). Ich registriere dict proxy dict1 unter typeName 'd1', damit ich remote darauf zugreifen kann. Ich überprüfe die Registry des Managers und sehe dort den dict proxy. Aber wenn ich versuche, darauf zuzugreifen, indem ich d1 anrufe, bekomme ich einen KeyError von der Fernbedienung. Ich weiß, dass ich eine Methode erstellen konnte, um auf mein dict zuzugreifen, aber es muss einen direkten Weg geben, um auf den dict-Proxy gemäß der Dokumentation zuzugreifen (Python 2, Kapitel 16.6).Python Manager Zugriff dict über die Registrierung

from multiprocessing.managers import SyncManager 
from sys import stderr 

proxy = SyncManager() 
proxy.start() 

dict1 = proxy.dict({'k1': 'blah'}) 
proxy.register('d1', dict1) 

# next line shows that d1 is bound method of manager 
print >>stderr, 'd1 is', proxy.d1 

# next line produces a KeyError 
print 'The value of d1 is', proxy.d1() 

Run Ausgang

d1 is <bound method SyncManager.d1 of <multiprocessing.managers.SyncManager object at 0x10925dd10>> 

Traceback (most recent call last): 
    File "/Users/adriancepleanu/PycharmProjects/AFX/UIproxy.py", line 32, in <module> 
    print 'The value of d1 is', proxy.d1() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 667, in temp 
    token, exp = self._create(typeid, *args, **kwds) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 567, in _create 
    id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 105, in dispatch 
    raise convert_to_error(kind, result) 
multiprocessing.managers.RemoteError: 
--------------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 207, in handle_request 
    result = func(c, *args, **kwds) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 380, in create 
    self.registry[typeid] 
KeyError: 'd1' 
--------------------------------------------------------------------------- 

Antwort

0

gefunden, dass der Proxy-Server nach der Anruf gestartet werden, müssen den neuen Typ zu registrieren; Es scheint, dass Registrierungen, die nach dem Start des Proxies gemacht wurden, nicht funktionieren.