2012-11-30 30 views
1

我的django網絡應用程序邏輯主要面向後臺任務執行(既有周期性的,也有獨立的,同步的以及異步的)。所有的研究似乎指出,使用芹菜是最推薦的方法。我打算最終在Heroku上部署,而且它支持Celery + Redis(我用於本地開發)對我來說是一個很大的優勢。Django與芹菜接口的作業隊列

但是,我需要比芹菜提供的更廣泛的調度功能。我需要我的一些定期任務來運行時間表,比如「在最後一個月的太陽上運行」等等。所以我在django中實現了我自己的模型來存儲重複規則和其他所需的參數。

現在我很難與我的表和芹菜接口。理想情況下,我想要做的是擁有我自己的Job模型,其中包含計劃,應該在到期時運行的任務以及任務的參數。類似於C++中的函數ptr。然後,我會運行一個守護進程,該守護進程會不斷檢查作業隊列中的哪個作業已到期,如果其定期創建下一個作業實例並將其推入隊列,然後使用celery的延遲方法或類似方法使用參數運行相關任務。

問題:

  1. 請問這種做法甚至有意義嗎?
  2. 如果沒有什麼其他的替代方法(ES),我可以用
  3. 如果是的話我怎麼去設計一個工作/事件隊列...

我很想聽到一個更好的方法這樣做,或是否有現有的實現可能適合或使用芹菜的作業隊列本身的方式作業隊列的...

感謝堆..

回答

0

芹菜葉對週期性任務的工作非常喜歡這個。有一個專門的調度程序(celery beat),它只需在任務到期時發送任務。

您還可以創建新的調度,以通過繼承celery.beat.Schedulerbeat使用,你可以通過繼承celery.schedules.schedule創建自定義的時間表太(像已經內置crontab時間表)。

在django-celery擴展中有一個數據庫支持的調度器實現(djcelery.schedulers.DatabaseScheduler),它使用許多技巧來避免頻繁輪詢數據庫等等(遺憾的是它沒有得到很好的評論)。

調度:https://github.com/celery/celery/tree/master/celery/beat.py 時間表:https://github.com/celery/celery/tree/master/celery/schedules.py DatabaseScheduler:https://github.com/celery/django-celery/tree/master/djcelery/schedulers.py