我正在使用Celery来运行数千个任务组,
每个任务需要几分钟才能运行。
下面的代码是multiprocessing.pool.Pool.map
的简单替换:
def map(task, data):
"""
Perform the *task* on *data* in distributed way. Blocks until finished.
"""
ret = celery_module.group(task.s(val) for val in data).apply_async()
return ret.get(interval = 0.1)
只要工人永不休息,这就像魅力一样。
但有时它会发生一个节点死亡,带着一些运行任务。
那么接下来发生的是所有其他任务完成,工人变得闲置,
但是get
永远等待死亡工人的结果。
如何在超时后重新执行死任务?
任务是幂等的,我完全不担心重复执行。
我试过玩CELERY_ACKS_LATE
并在这里和那里加班,
但似乎没有什么可以解决这种情况。
我觉得我错过了一些明显的东西,却找不到什么。
编辑:代理和结果使用的传输是Redis。
答案 0 :(得分:0)
这里的正确行为是设置超时以及何时重试整个map
任务。