2011-09-08 83 views
2

我經常有一些模型是某些遠程資源的本地副本,需要定期保持同步。每個實體的定期任務

Task(
    url="/keep_in_sync", 
    params={'entity_id':entity_id}, 
    name="sync-%s" % entity_id, 
    countdown=3600 
).add() 

裏面keep_in_sync任何更改都保存到模型和一個新的任務安排在稍後再次發生。

現在,雖然表面上看起來這是一個很好的解決方案,但在實踐中,如果所有必要的任務都真的添加了,您可能會擔心。也許你有倉庫籠子裏的食物顆粒水平的實體,以便自動發送電子郵件給你的管家餵它們。但幾周後,當你從假期回來時,你會發現你的幾個倉鼠捱餓。

然後,它開始看起來像一個好主意,使一個腳本,通過每個實體,並確保適當的任務真的在隊列中。但是Task和Queue類都沒有任何方法來檢查任務是否存在。

您可以拯救倉鼠,並想出一個更好的方法來確保每個實體週期性地調用真正的方法嗎?

更新

看來,如果你想成爲真正確保任務計劃,你需要保持自己的任務跟蹤尼克·約翰遜建議。沒有準備好放棄方便的任務隊列,所以暫時只會容忍無法檢查任務是否真正安排的不確定性。

+0

+1爲倉鼠隱喻:) – Xion

回答

1

相反入隊每個實體的任務的,在一個任務中處理多個實體。例如,這可以通過日常的cron作業觸發,這可以解決多個任務。除了確保您爲每個實體執行代碼外,還可以利用異步URLFetch更有效地與外部資源同步,批量放入並從數據存儲中獲取以使更新更有效。

+0

這是一個非常有趣的想法,特別是因爲它可能會節省一些資源。有了足夠的實體,雖然可能沒有足夠的時間在單個cron作業處理程序中啓動所有任務,但不知道如何扇出完全可行。 – Bemmu

+0

您可以通過使用光標逐塊地將其分成幾個步驟 –