celery停止任务

1,093 阅读1分钟

因为需要停止任务操作,查看很多帖子都没解决问题,查看源码又因为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