在块中重写芹菜任务的行为

时间:2015-06-04 20:09:59

标签: python celery

我有一个关于在chunk内重试芹菜任务的问题。我的python版本是2.7.9,我的芹菜版本是3.1.18

当一个块中的单个任务失败时,它似乎没有被重试,而是整个块一起失败。

首先,有时会失败的任务:

@app.task(bind=True, default_retry_delay=30, max_retries=5)
def sometimes_add(self, x, y):
    try:
        if random.randint(0, 10) < 8:
            return x + y
        else:
            raise Exception("I'm failing!")
    except Exception as e:
        raise self.sometimes_add.retry(exc=e)

任务调用100次,分为5个部分,因此有20个任务:

sometimes_add.chunks(zip(range(100), range(100)), 5).apply_async()

我希望块中的失败任务一旦失败就会被重试,但是根本没有任何任务似乎被重试,并且整个5个任务的大部分都作为一个单元失败。

我对Celery来说很新,所以我肯定错过了使用任务分块的最佳方法。如果是这样,我会感激任何反馈。非常感谢!

2 个答案:

答案 0 :(得分:0)

您是否设置了后端设置?来自docs

  

和弦中使用的任务不得忽略其结果。实际上,这意味着您必须启用CELERY_RESULT_BACKEND才能使用和弦。此外,如果在配置中将CELERY_IGNORE_RESULT设置为True,请确保使用ignore_result = False定义要在和弦中使用的各个任务。这适用于Task子类和装饰任务。

答案 1 :(得分:-1)

这里看起来有语法错误:

sometimes_add.chunks(zip(range(100), range(100)), 5).apply_async()

在添加第三个参数之前你正在关闭zip()函数 - 我认为它应该是这样的:

sometimes_add.chunks(zip(range(100), range(100), 5)).apply_async()