芹菜设置和拆卸任务

时间:2015-10-20 09:29:40

标签: celery

我正在尝试使用芹菜来并行化对具有不同参数的函数的评估。 这是我想要实现的伪代码,它假定有一个名为evaluate的函数用@app.task

装饰
# 0. Setup cluster, celery or whatever parallelisation backend
pass


# 1. Prepare each node to simulate, this means sending some files
for node in mycluster:
    #send files to node
    pass

# 2. Evaluation phase
gen = Generator() # A Generator object creates parameter vectors that need to be evaluated
while not gen.finished():
    par_list = gen.generate()
    asyncs = []
    for p in par_list:
        asyncs.append(evaluate.delay(p))


    results = [-1 for _ in par_list]

    for i, pending in enumerate(asyncs):
            if not pending.ready():
                pending.wait()
            if pending.successful():
                results[i] = pending.get()
            else:
                pass # manage error 
     # send results to generator so that it generates a new set of parameters later
     gen.tell(results)


# 3. Teardown phase
for node in mycluster:
    #tell node to delete files
    pass

这种方法的问题在于,如果我的主应用程序正在运行,并且它已经通过了设置阶段,那么当新节点连接时,它肯定不会通过设置阶段。同样,如果节点断开连接,则不会执行拆卸阶段。

我想到了几个解决方案:

  • 不使用设置阶段,而是链接两个函数,以便每个节点都进行设置评估|对“2.评估阶段”循环的每次迭代进行拆解。这里的问题是通过消息队列发送文件是我想尽可能避免的。
  • 配置工作人员进行设置和拆卸任务,以便他们在连接时自动就绪。我尝试使用bootsteps.StartStopStep,但我不确定这是否是正确的方法。
  • 设置分布式文件系统,以便在评估之前和之后无需准备和删除文件

这里的具体问题是,这类任务的推荐方法是什么?我确信这不是一个错综复杂的用例,也许你们中的一个可以就如何处理这个问题提供一些指导。

1 个答案:

答案 0 :(得分:0)

我不确定这是一个工人问题 - 请记住,您可能在节点上有许多工作人员。这听起来更像是节点初始化问题。为什么不在芹菜工作者之前运行并且复制文件的作业(系统任务,初始化脚本等)。同样,相反,为了拆除。