2016-11-21 99 views
3

如何使用每小時查詢數據庫的Celerybeat和Flask設置定期任務?安裝芹菜週期性任務

的環境是這樣的:

/ 
|-app 
    |-__init__.py 
    |-jobs 
    |-task.py 
|-celery-beat.sh 
|-celery-worker.sh 
|-manage.py 

我現在有一個名爲run_query()查詢功能位於task.py

我想要調度程序踢一旦應用程序啓動,所以我有下面幾行我/app/__init__.py文件夾:

celery = Celery() 

@celery.on_after_configure.connect 
def setup_periodic_tasks(sender, **kwargs): 
    sender.add_periodic_task(1, app.jobs.task.run_query()) 

(爲簡單起見,我已經設定,使如果它運行,它會每分鐘運行一次。沒有這樣的運氣呢。)

當我啓動celery-worker.sh它確認我的功能在[tasks]標題下。但計劃的函數從不運行。我可以手動迫使功能通過發出運行在命令提示以下:

>> from app.jobs import task 
>> task.run_query.delay() 

EDIT:添加celerybeat.sh

作爲後續:如果數據庫是通過燒瓶上下文中訪問,在我的異步函數調用期間,創建一個新的上下文來訪問數據庫是明智的嗎?使用現有的燒瓶環境?或者完全忘記上下文,只是啓動到數據庫的連接?我擔心的是,如果我只是啓動一個新的連接,它可能會干擾現有的上下文的連接?

+1

您還需要運行調度服務。 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#starting-the-scheduler。 **芹菜擊敗**是一個調度程序;它定期開始執行任務,然後由集羣中可用的工作節點執行。 –

回答

3

要運行定期任務,你需要一些schduler(如芹菜拍)。

芹菜拍是調度程序;它定期啓動任務,然後由集羣中可用的工作節點執行。

您必須確保一次只有一個調度程序正在運行時間表 ,否則最終會出現重複任務。使用集中式方法意味着日程安排不必是 同步,並且服務可以在不使用鎖的情況下運行。

參考:periodic-tasks

與命令

您可以調用調度,

$ celery -A proj beat #different process from your worker 

您也可以通過嵌入使工人-B 選項擊敗工人裏面,這是方便,如果您將永遠不會運行多個工作人員節點,但它不常用,因此建議不要使用 以供生產使用啓動調度uler:

$ celery -A proj worker -B 

參考:celery starting scheduler