因为需要停止任务操作,查看很多帖子都没解决问题,查看源码又因为celery版本过多,有些方法被整合弃用。一直没解决问题。现记录可用停止任务代码
生效场景:
celery在执行任务时通过任务id停止任务 (使用场景ubuntu18.04,python3.9.7,celery 4.4.2)
生效前提:celery默认方式prefork启动
celery -A workers worker --loglevel info
关键代码
from celery import Celery as celery_Celery
from config import Config
from workers import celery_config
connect_mongo('Celery_Worker')
celery_app = celery_Celery(
Config.NAME,
backend=Config.CELERY_RESULT_BACKEND,
broker=Config.CELERY_BROKER_URL,
config_source=celery_config
)
celery_app.autodiscover_tasks(['workers.tasks'])
def kill_task(task_id: str) -> bool:
try:
with celery_app.default_connection() as connection:
celery_app.control.revoke(str(task_id), connection=connection, terminate=True, signal='KILL')
return True
except:
return False
if __name__ == '__main__':
celery_app.start()
调用kill_task函数即可停掉对应id执行的任务
开发中遇到的问题
- 环境仅测试了ubuntu和win, win下因为信号的问题不会生效,ubuntu正常使用
- celery 以threading方式启动不生效,但是可以使用prefork方式启动,协程方式启动未实践。
- 一个worker运行多个任务时执行停止任务时会将所有任务都停止掉,解决办法是配置中添加CELERYD_MAX_TASKS_PER_CHILD = 1