Celery Worker达到max-task-per-child设定值后未重启的解决咨询
Celery worker_max_tasks_per_child不生效的解决方法
你遇到的问题是配置了worker_max_tasks_per_child=2,使用prefork池和默认并发,但子进程完成指定任务数后未自动重启释放内存。结合你提供的配置信息,可按以下步骤排查修复:
确认配置归属,避免框架配置混淆
从你给出的celery report看,包含大量Flask框架的配置项,说明你可能把Celery的worker_max_tasks_per_child配置放到了Flask的app.config中,这会导致Celery无法读取到正确的Worker配置。
正确做法是单独为Celery实例配置:from celery import Celery celery_app = Celery("your_app_name") celery_app.conf.update( worker_max_tasks_per_child=2, pool="prefork", timezone="UTC", # 其他Celery专属配置 )或者通过启动命令传递参数,确保配置生效:
celery -A your_app_name worker --max-tasks-per-child=2 --pool=prefork --loglevel=info日志验证子进程行为
启动Worker时添加--loglevel=info,查看日志输出。当子进程完成指定任务数后,日志中应出现类似Child process [PID] exited after 2 tasks的记录,以此确认重启逻辑是否触发。如果无此日志,说明配置未被正确加载。排除任务异常干扰
若任务执行中存在未捕获的异常,子进程可能提前退出,但这不是max-tasks-per-child触发的正常重启。检查任务执行日志,确保每个任务都能正常完成。升级Celery版本
旧版本Celery在prefork池模式下存在max-tasks-per-child的兼容性bug,建议升级到5.x及以上版本:pip install --upgrade celery
内容的提问来源于stack exchange,提问作者Shadan Kalam
相关产品推荐
相关产品推荐

