考虑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}}?有没有更好/更合适的方式?
答案 0 :(得分:0)
您需要指定一个ListProxy
,以便无缝访问__dunder__
,__getitem__
等常规列表__setitem__
方法。
from multiprocessing.managers import ListProxy
JobQueueManager.register('get_params', callable=lambda: ['123'], proxytype=ListProxy)
如果您未指定ListProxy
,则最终只能从列表对象(append
,extend
等)访问公共方法。