celery 中止執行中 task

目錄數據庫

緣由

由於最近項目需求中須要提供對異步執行任務終止的功能,因此在尋找中止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

相關文章
相關標籤/搜索