所以我现在使用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以正确的顺序返回结果。有什么我想念的吗?
答案 0 :(得分:1)
为可能面临同样问题的任何其他人发布此答案。
芹菜中的redis后端代码是以这样一种方式编写的,即结果一旦完成就会被推送到redis列表,从而改变顺序。
我在celery的github问题页面上发布了相同的查询,并从其中一个贡献者处获得了answer。