Python 如何为每个Django模型实例安排周期性芹菜任务?

Python 如何为每个Django模型实例安排周期性芹菜任务?,python,django,celery,django-celery,Python,Django,Celery,Django Celery,我的数据库中有一堆提要对象,我试图让每个提要每小时更新一次。我这里的问题是,我需要确保没有任何重复的更新——它需要每小时不超过一次,但我也不希望提要等待两个小时的更新。(如果每小时+/-几分钟发生一次也没关系,但几分钟内发生两次是不好的。) 我正在使用Django和芹菜与Amazon SQS作为代理。我将feed更新代码设置为芹菜任务,但是我没有找到一种方法来防止重复,同时与在多个节点上运行的芹菜保持兼容 我当前的解决方案是向提要模型添加last\u update\u scheduled属性,并

我的数据库中有一堆提要对象,我试图让每个提要每小时更新一次。我这里的问题是,我需要确保没有任何重复的更新——它需要每小时不超过一次,但我也不希望提要等待两个小时的更新。(如果每小时+/-几分钟发生一次也没关系,但几分钟内发生两次是不好的。)

我正在使用Django和芹菜与Amazon SQS作为代理。我将feed更新代码设置为芹菜任务,但是我没有找到一种方法来防止重复,同时与在多个节点上运行的芹菜保持兼容

我当前的解决方案是向提要模型添加
last\u update\u scheduled
属性,并每5分钟运行一次以下任务(伪代码):

这容易受到许多同步问题的影响。例如,如果备份了任务队列,则此任务可能同时运行两次,从而导致重复更新。我见过一些解决方案(如和),但memcached解决方案不可靠,例如,重新启动memcached时可能会发生重复,或者如果内存不足并清除旧数据时可能会发生重复。更不用说,我不愿意为了一个简单的锁而将memcached添加到我的生产配置中

在一个完美的世界里,我想说:

@modelTask(Feed, run_every=3600)
def updateFeed(feed):
    # do something expensive

但是到目前为止,我的想象力使我无法实现这个装饰器。

说得很清楚,芹菜配方本身并没有使用memcached,而是使用Django的缓存中间件。有许多其他的缓存方法可以满足您的需要,而不存在memcached的缺点。有关详细信息,请参阅

@modelTask(Feed, run_every=3600)
def updateFeed(feed):
    # do something expensive