由於最近項目需求中須要提供對異步執行任務終止的功能,因此在尋找中止celery task任務的方法。這種需求之前沒有碰到過,因此,只能求助於百度和google,可是找遍了資料,都沒找到相關的能中止celery task任務的方法(網上找到的一個方法實測不能用,多是celery版本的緣由,個人項目目前使用的是celery 4.0.2)app
因爲網上找不到解決辦法,因而只能本身想辦法了。
想到celery 管理工具flower裏面好像有中止celery task的功能,因而去找flower的源碼,找到接口的源碼以下:異步
logger.info("Revoking task '%s'", taskid) terminate = self.get_argument('terminate', default=False, type=bool) self.capp.control.revoke(taskid, terminate=terminate) self.write(dict(message="Revoked '%s'" % taskid))
核心代碼是self.capp.control.revoke
想到去celery裏面找尋revoke
函數,發現有兩處比較可疑,第一個是celery.worker.control.revoke
,第二個是celery.app.control.Control.revoke
,直覺來看,應該是第二個方法,可是第二個方法是在一個類裏面的,要調用這個方法首先須要獲取到celery app的實例,後來去celery 配置裏面找,發如今__init__.py文件裏面有__all__ = ['celery_app']
這麼一句,因而找到突破點了,引用這個包就能獲取到celery_app了。函數
from test.ceyery_proj import celery_app celery_app.control.revoke(task_id, terminate=True)
經過這個方法就能終止正在執行的task,至於task_id在執行任務的時候返回了,我將這個id存儲在數據庫中,這樣就能夠被拿來控制task的執行了。工具
寫這篇文檔的目的主要是幫助小夥伴們不要再踩這個坑了,也爲celery提供一點文檔補充吧。google