在工人死亡后重新启动组中的长任务

时间:2012-11-09 11:15:40

标签: python celery

我正在使用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。

1 个答案:

答案 0 :(得分:0)

这里的正确行为是设置超时以及何时重试整个map任务。