【问题标题】:Retry behavior for celery tasks within a chunk块内 celery 任务的重试行为
【发布时间】:2015-08-19 14:50:09
【问题描述】:

我有一个关于在 chunk 中重试 celery 任务的问题。我的python版本是2.7.9,我的celery版本是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 很陌生,所以我肯定错过了使用任务分块的最佳方法的一些相当基本的东西。如果是这样,我将不胜感激任何反馈。非常感谢!

【问题讨论】:

    标签: python celery


    【解决方案1】:

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

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

    【讨论】:

    • 啊,谢谢你的评论!我确实有一个结果后端设置(amqp)。此外,看起来文档中的这个特定部分指的是和弦,而不是块。它们有某种关联吗?
    【解决方案2】:

    这里好像有语法错误:

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

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

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

    【讨论】:

    • 没有 chunk 函数需要 2 个参数,一个 'work' 的可迭代对象和将其分成的块数。
    • 你说得对,那里的两个例子不同意,但我认为它们是错别字。 chunks 的文档说签名是 (it, n): celery.readthedocs.org/en/latest/reference/… 。也许我们中的一个人应该向 celery 提出问题以修复文档?
    • 为了生成这个例子,我只是简单地将 add 任务替换为有时 _add 任务,直接取from the docs on celery。它似乎在本地运行得很好——一些块是成功的。我主要只是好奇如何重试分块的任务。感谢您的评论!
    猜你喜欢
    • 2011-07-17
    • 2011-06-19
    • 2011-07-05
    • 2019-02-16
    • 2012-04-12
    • 1970-01-01
    • 2013-12-27
    • 2016-02-25
    • 2018-04-06
    相关资源
    最近更新 更多