使用ipyparallel集群共享队列

时间:2016-04-25 17:29:52

标签: python python-multiprocessing ipython-parallel

我正在尝试将ipyparallel作为我的主 - 奴隶架构中multiprocessing的替代。

即,目前所有进程都有两个队列:

  • 一个用于从主人到奴隶的任务
  • 一个从奴隶到掌握的结果。

目前我使用multiprocessing.Manager().Queue()个队列进行通信。但是,它们似乎无法与ipyparallel进程共享。

我这样做的原因(而不仅仅是通过功能)是因为"设置"从头开始的工人几乎和执行计算一样昂贵(计算方面)。我更喜欢运行一个函数(通过map_async或类似的函数)来设置工作者的环境,执行第一次计算,将结果推送到结果队列,然后获取(显着更小)更新从任务队列中重复最后几个步骤直到停止(再次通过队列)。

如果有更好的方法/框架来完成这类任务(不过它必须是python),我全心全意。

由于

1 个答案:

答案 0 :(得分:4)

使用IPython并行时,通常使用DirectView进行“设置”,然后将依赖于该设置的较小任务分发为传递给负载平衡视图的函数。

设置您的客户端和观看次数:

import ipyparallel as ipp

rc = ipp.Client()
dview = rc[:]
lbview = rc.load_balanced_view()

使用直接视图进行设置:

dview.execute("data = setup()")

现在,您可以使用ipp.Reference

在任务中依赖它
def task(data):
    analyze(data)

rdata = ipp.Reference('data')
ar = view.apply(task, rdata)
result = ar.get()

通过这种方式,您可以在任何地方进行一次设置,然后以负载平衡的方式运行依赖于该设置的任务。