使用django-celery chord,celery.chord_unlock会一直执行,不会调用提供的回调

Mar*_*óth 9 chord redis django-celery

我正在使用Django Celery和Redis来运行这样的一些任务:

header = [
    tasks.invalidate_user.subtask(args = (user)),
    tasks.invalidate_details.subtask(args = (user))
]

callback = tasks.rebuild.subtask()

chord(header)(callback)   
Run Code Online (Sandbox Code Playgroud)

所以基本上与文档中说明的相同.

我的问题是,当调用此任务和弦时,celery.chord_unlock任务将永远重试.header成功完成的任务,但由于chord_unlock从未完成,callback从未被调用.

猜测我的问题是无法检测到任务header完成,我转向文档,看看如何定制.我找到了一个部分,描述了如何实现同步,提供了一个示例,我缺少的是如何调用该示例函数(即是否有信号?).

还有一点需要注意,此方法不适用于Redis后端:

除Redis和Memcached之外的所有结果后端都使用它,它在标头中的每个任务之后递增计数器,然后在计数器超过集合中的任务数时应用回调.

但也说,Redis方法更好:

Redis和Memcached方法是一个更好的解决方案

那是什么方法?它是如何实现的?

那么,为什么chord_unlock永远不会完成,如何让它检测完成的header任务呢?

我正在使用:Django 1.4,芹菜2.5.3,django-celery 2.5.5,redis 2.4.12

小智 8

您没有任务示例,但我遇到了同样的问题,我的解决方案可能适用.

我已经ignore_result=True完成了我添加到和弦的任务,定义如下:

@task(ignore_result=True)
Run Code Online (Sandbox Code Playgroud)

显然忽略了结果使得chord_unlock任务不知道它们是完整的.删除ignore_result后(即使任务只返回true),和弦也正确地调用了回调.