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),和弦也正确地调用了回调.