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,但我不确定这是否正确。
- 安装分布式文件系统,这样就没有必要前后评估
的具体问题,这是后准备和删除文件,什么是这些类型的任务的建议的方法?我相信这不是一个复杂的用例,也许你可以提供一些指导我应该如何处理这个问题。