Celery關閉執行中的任務策略

問題描述:設計的系統中需要執行一個長時間的運行的任務,這個任務可以比作是“開啓機器後,機器的運行”。現在需要對機器的停止可控,於是需要研究Celery中關閉執行中的任務方法。

首先,參考文章《celery 停止執行中 task》,這篇文章中提出“celery 管理工具flower裏面好像有停止celery task的功能”,於是開啓Celery的flower發現,確實可通過“flower”進行控制關閉。

# 創建任務
@app.task   
def celery_task1():
    while True:
        time.sleep(3)
        print "this is celery task1"

這裏設置一個任務,任務中循環執行語句打印,以模擬無限長的任務。(默認讀者具備Celery使用的基礎知識,一些基本使用方法可以參考一下我的另一篇博文:《Celery分佈式實踐》)

開啓Celery服務:

celery -A XXXX worker -l info -Q XXX

然後,開啓Celery的flower控制:

celery flower --broker=Celery中使用的broker

1、通過flower結束任務

 根據輸出的信息,打開對應的網址,確保flower服務已開啓:

 這裏,我使用一個單獨的py文件啓動任務:

from celeryProject1 import tasks1

if __name__ == "__main__":
    tasks1.celery_task1.delay()

運行,查看flower控制界面:

按照上圖箭頭示意,依次點擊,即可結束任務。 Celery服務監控窗口顯示:

2、通過程序控制結束任務

修改啓動任務的程序:

from celeryProject1 import tasks1
from celery.app.control import Control
from celeryProject1.celery import app
import time

if __name__ == "__main__":
    t = tasks1.celery_task1.delay()
    print "*******task id******", str(t.id)

    time.sleep(20)
    # # 停止任務
    celery_control = Control(app=app) 
    celery_control.revoke(str(t.id), terminate=True)  

其中,from celeryProject1.celery import app,對應程序配置文件的app設置(具體根據自己的實際情況修改)

“t.id”是獲取任務的id,然後通過revoke方法停止任務的執行。

運行上述程序,觀察Celery服務的輸出:

 任務“celery_task1”每3秒執行一次打印輸出“"this is celery task1"”,發佈任務後,主程序等待20秒後,結束任務。

另外,可以觀察到主程序輸出的任務id於“flower”中任務的UUID一致:

 

建議閱讀:

問題:如何使用celery隨時開啓任務,隨時關閉正在運行的任務

celery 停止執行中 task

Celery3.1文檔-revoke

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章