使用multiprocessing.managers.SyncManager共享一个常量值

时间:2014-09-29 21:18:30

标签: python multiprocessing cluster-computing distributed-computing

考虑http://eli.thegreenplace.net/2012/01/24/distributed-computing-in-python-with-multiprocessing/中的联网多处理设置(即,一个服务器,其中两个队列与网络上的许多连接客户端共享)。

我想扩展此示例,以便服务器可以与所有客户端共享一些参数。在链接代码之后,我通过注册额外的可调用(JobQueueManager位)来扩展get_params服务器端):

JobQueueManager.register('get_job_q', callable=lambda: job_q)
JobQueueManager.register('get_result_q', callable=lambda: result_q)
JobQueueManager.register('get_params', callable=lambda: ['123'])

manager = JobQueueManager(address=('', port), authkey=authkey)
manager.start()

为了完成这项工作,我必须更改客户端代码,如下所示

job_q       = manager.get_job_q()
result_q    = manager.get_result_q()
params      = manager.get_params()._getvalue()

但是,为什么我需要_getvalue(),而队列中不需要{{1}}?有没有更好/更合适的方式?

1 个答案:

答案 0 :(得分:0)

您需要指定一个ListProxy,以便无缝访问__dunder____getitem__等常规列表__setitem__方法。

from multiprocessing.managers import ListProxy

JobQueueManager.register('get_params', callable=lambda: ['123'], proxytype=ListProxy)

如果您未指定ListProxy,则最终只能从列表对象(appendextend等)访问公共方法。