如何避免Celery中同名app.tasks任务同时执行?
问题:实现Celery同名任务单实例串行执行
经过多次测试与搜索仍未解决问题,盼您指导。代码托管于GitHub,因主代码复杂,已编写复现问题的简易示例。我有一个worker包含四个app.tasks:app_1000、app_1002、app_1004、app_1006,要求每个同名任务同一时间仅执行一次,当前任务完成后才可执行下一个。
Celery配置如下:
broker_url='amqp://guest@localhost//' result_backend='rpc://' include=['celery_app.tasks'] worker_prefetch_multiplier = 1 task_routes={ 'celery_app.tasks.app_1000':{'queue':'q_app'}, 'celery_app.tasks.app_1002':{'queue':'q_app'}, 'celery_app.tasks.app_1004':{'queue':'q_app'}, 'celery_app.tasks.app_1006':{'queue':'q_app'}, 'celery_app.tasks.app_timeout':{'queue':'q_timeout'}, }
配置中已设置worker_prefetch_multiplier = 1。我使用FastAPI发送请求,用Flower监控任务。发送20个任务后,初期正常,但后续出现同名任务并发执行的情况(如app_1000、app_1006同时运行多个实例)。
期望:同名任务同一时间仅执行一个实例,但不知如何实现。
重要提示:请勿建议为每个任务创建独立队列,实际项目中有100+个app.tasks,管理成本过高。
如需运行示例,可执行以下命令:
celery -A celery_app worker -Q q_app --loglevel=INFO --concurrency=4 -n worker@%h celery flower --port=5566 uvicorn api:app --reload
内容的提问来源于stack exchange,提问作者Sardar
相关产品推荐
相关产品推荐

