我正在尝试使用芹菜来并行化对具有不同参数的函数的评估。
这是我想要实现的伪代码,它假定有一个名为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
这种方法的问题在于,如果我的主应用程序正在运行,并且它已经通过了设置阶段,那么当新节点连接时,它肯定不会通过设置阶段。同样,如果节点断开连接,则不会执行拆卸阶段。
我想到了几个解决方案:
这里的具体问题是,这类任务的推荐方法是什么?我确信这不是一个错综复杂的用例,也许你们中的一个可以就如何处理这个问题提供一些指导。
答案 0 :(得分:0)
我不确定这是一个工人问题 - 请记住,您可能在节点上有许多工作人员。这听起来更像是节点初始化问题。为什么不在芹菜工作者之前运行并且复制文件的作业(系统任务,初始化脚本等)。同样,相反,为了拆除。