問題描述:設計的系統中需要執行一個長時間的運行的任務,這個任務可以比作是“開啓機器後,機器的運行”。現在需要對機器的停止可控,於是需要研究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隨時開啓任務,隨時關閉正在運行的任務