![](/img/trans.png)
[英]Django Celery: create periodic task at runtime with schedule depending on user input
[英]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.