在python多处理模块中,为了从远程Manager获取对象,大多数食谱告诉我们需要构建一个getter来恢复每个对象:
class QueueMgr(multiprocessing.managers.SyncManager): pass
datos=Queue()
resultados=Queue()
topList=list(top)
QueueMgr.register('get_datos',callable=lambda:datos)
QueueMgr.register('get_resultados',callable=lambda:resultados)
QueueMgr.register('get_top',callable=lambda:topList)
def Cola_run():
queueMgr=QueueMgr(address=('172.2.0.1', 25555),authkey="foo")
queueMgr.get_server().serve_forever()
Cola=Thread(target=Cola_run)
Cola.daemon=True
Cola.start()
并且必须在客户端程序中声明相同的getter:
class QueueMgr(multiprocessing.managers.SyncManager): pass
QueueMgr.register('get_datos')
QueueMgr.register('get_resultados')
QueueMgr.register('get_top')
queueMgr=QueueMgr(address=('172.22.0.4', 25555),authkey="foo")
queueMgr.connect()
datos=queueMgr.get_datos()
resultados=queueMgr.get_resultados()
top=queueMgr.get_top()._getvalue()
好的,它涵盖了大多数使用案例。但我发现代码看起来很难看。也许我没有得到正确的食谱。但如果真的如此,那么至少我可以在客户端做一些更好的代码,也许是自动声明getter,如果我能事先知道Manager正在分享什么对象。他们是这样做的吗?
如果您认为multiprocessing.Manager()提供的SyncManager实例允许创建复杂的Proxy对象,但连接到此类SyncManager的任何客户端似乎需要从其他地方获取对此类代理的引用,那么尤其令人不安。 / p>
答案 0 :(得分:1)
没有什么可以阻止你自省内省,并且对于每个共享属性,生成getter并调用register
。