使用redis后端的Celery v4组任务行为

时间:2017-01-23 06:03:29

标签: python redis rabbitmq celery amqp

所以我现在使用celery v3.x已经有一段时间了,并且考虑到正式迁移到v4。现在,我正在使用通过PyPI提供的v4.0.2。两个版本中都存在很少的不匹配,但令我困惑的是:

这是我的任务文件:

from celery import group, chord
from worker import app


@app.task(name='task')
def task(i):
    return i


@app.task(name='remaining')
def dummy(result):
    print result

@app.task(name='mainTask')
def mainTask():
    groupTask = group([task.s(i) for i in range(0,10)])
    job = chord(groupTask, dummy.s())()
    return job

当我调用mainTask时,后续的组任务会被执行,但当我尝试通过dummy打印此任务的结果时,结果的顺序就会变得混乱。示例输出将是:

[0, 1, 2, 3, 4, 8, 6, 9, 7, 5]

奇怪的是,只有当结果后端是redis时才会发生这种情况。在使用amqp时,结果将按照以下确切顺序显示:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

P.S。,这种行为在旧版芹菜中不存在。 Redis以及amqp以正确的顺序返回结果。有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

为可能面临同样问题的任何其他人发布此答案。

芹菜中的redis后端代码是以这样一种方式编写的,即结果一旦完成就会被推送到redis列表,从而改变顺序。

我在celery的github问题页面上发布了相同的查询,并从其中一个贡献者处获得了answer