【问题标题】:Share a constant value using multiprocessing.managers.SyncManager使用 multiprocessing.managers.SyncManager 共享一个常量值
【发布时间】:2014-09-29 21:18:29
【问题描述】:

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

我想扩展这个例子,使服务器可以与所有客户端共享一些参数。按照链接代码,我通过注册一个额外的可调用对象(get_params 位)扩展了JobQueueManager服务器 端):

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

为了完成这项工作,我必须更改 client 代码如下

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

但是,为什么我需要_getvalue() 而队列不需要呢?有没有更好/合适的方法?

【问题讨论】:

    标签: python multiprocessing cluster-computing distributed-computing


    【解决方案1】:

    您需要指定您想要一个ListProxy,以便您可以无缝访问普通列表__dunder__ 方法,例如__getitem____setitem__ 等。

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2014-07-20
      • 2019-01-21
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多