如何知道Python multiprocessing管理器正在共享哪些对象?

1 投票
1 回答
631 浏览
提问于 2025-04-17 11:18

在Python的多进程模块中,如果我们想从远程的管理器那里获取一个对象,大多数教程都会告诉我们需要写一个获取器来拿到每个对象:

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()

然后在客户端程序中也必须声明同样的获取器:

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()

这确实覆盖了大部分的使用情况。但我觉得代码看起来很丑。也许我没有找到正确的方法。如果真的是这样,那我至少可以在客户端写一些更好看的代码,或许可以自动声明获取器,只要我能提前知道管理器共享了哪些对象。有没有办法做到这一点呢?

如果你考虑到由multiprocessing.Manager()提供的SyncManager实例可以创建复杂的代理对象,但任何连接到这样的SyncManager的客户端似乎都需要从其他地方获取这些代理的引用,这就特别让人困扰。

1 个回答

1

你可以随意查看这个类的内容,对于每一个共享的属性,生成一个获取值的方法(getter),然后调用 register 方法。

撰写回答