簡體   English   中英

如何為每個Django模型實例安排定期的Celery任務?

[英]How to schedule a periodic Celery task per Django model instance?

我的數據庫中有一堆Feed對象,並且我試圖使每個Feed每小時更新一次。 我在這里的問題是,我需要確保沒有重復的更新-它每小時最多需要進行一次,但是我也不希望Feed等待兩個小時進行更新。 (如果每小時每隔+/-分鍾發生一次是可以的,但幾分鍾內發生兩次是不好的。)

我將Django和Celery與Amazon SQS用作代理。 我已將Feed更新代碼設置為Celery任務,但是我找不到能夠防止重復的方法,同時又與在多個節點上運行的Celery兼容。

我當前的解決方案是向feed模型添加一個last_update_scheduled屬性,並每5分鍾運行一次以下任務(偽代碼):

threshold = datetime.now() - timedelta(seconds=3600)
for f in Feed.objects.filter(Q(last_update_scheduled__lt = threshold) |
                             Q(last_update_scheduled = None)):
    updateFeed.delay(f)
    f.last_update_scheduled = now
    f.save()

這容易受到許多同步問題的影響。 例如,如果備份了我的任務隊列,則該任務可能同時運行兩次,從而導致重復更新。 我已經看到了一些解決方案(例如Celery的配方對Stack Overflow的改編 ),但是memcached解決方案並不可靠,例如,重新啟動memcached或內存不足並清除舊數據時可能會發生重復。 更不用說我討厭只為了簡單的鎖定而將memcached添加到生產配置中。

在理想的世界中,我想說:

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

但是到目前為止,我的想象力使我無法實現該裝飾器。

需要明確的是,Celery食譜本身並沒有使用memcached,而是使用了Django的緩存中間件。 還有許多其他緩存方法可以滿足您的需求,而不會帶來memcached的不利影響。 有關詳細信息,請參見Django緩存文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM