我正在使用 Django Celery 和 Redis 来运行一些这样的任务:
header = [
tasks.invalidate_user.subtask(args = (user)),
tasks.invalidate_details.subtask(args = (user))
]
callback = tasks.rebuild.subtask()
chord(header)(callback)
所以基本上与文档中所述相同。
我的问题是,当调用此任务和弦时,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