问题描述:设计的系统中需要执行一个长时间的运行的任务,这个任务可以比作是“开启机器后,机器的运行”。现在需要对机器的停止可控,于是需要研究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随时开启任务,随时关闭正在运行的任务