2017-01-23 67 views
0

因此,我现在一直在使用celery v3.x并考虑从正式迁移到v4之后迁移到v4。现在,我正在使用通过PyPI提供的v4.0.2。有两个版本数不匹配,但让我困惑的一个是这样的:使用redis后端的芹菜v4组任务行为

这是我的任务文件:

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

为任何可能面临同样问题的人发布这个答案。

芹菜里的redis后端代码是这样编写的,只要它结束,结果就会被推送到一个redis列表,从而改变顺序。

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