2015-10-20 91 views
0

我想用芹菜来平行不同参数的功能评估。 这就是为什么我想实现一个伪代码,它假定有装饰的一个名为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,但我不确定这是否正确。
  • 安装分布式文件系统,这样就没有必要前后评估

的具体问题,这是后准备和删除文件,什么是这些类型的任务的建议的方法?我相信这不是一个复杂的用例,也许你可以提供一些指导我应该如何处理这个问题。

回答

0

我不确定这是否是工人问题 - 请记住,您可能在节点上有大量工作人员。这听起来更像是一个节点初始化问题。为什么没有一个工作(一个系统任务,一个初始化脚本,不管)在芹菜工人之前运行并且复制文件。同样,反之亦然,用于拆除。