Celery Worker报KeyError: 'get_option' 任务未注册问题排查
问题根因
抛出KeyError: 'get_option'的核心原因是Celery Worker启动时没有正确加载到你定义的Celery实例和对应任务模块,任务根本没完成注册,拿到MQ里的任务消息后匹配不到执行逻辑。
具体修复步骤
- 修正Worker启动命令
你docker-compose中写的启动命令celery -A celery worker -l debug是错误的:-A参数需要指定你定义Celery实例的模块路径,你的实例存放在worker/celery_app.py中,实例名为celery_app,所以启动命令要改成:command: celery -A worker.celery_app worker -l info - 修复错误的卷挂载配置
当前配置把本地代码挂载到容器的/tmp/worker路径,这个路径不在Python的模块搜索范围内,Worker根本读不到你的任务代码。需要把本地server目录挂载到容器的工作目录(和你Dockerfile中设置的WORKDIR保持一致,假设工作目录为/app):volumes: - ./server:/app - 修正错误的环境变量
结果后端的Redis地址多写了一个@,同时补充Python搜索路径配置:environment: - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// - CELERY_RESULT_BACKEND=redis://redis:6000/0 - PYTHONPATH=/app # 把工作目录加入Python模块搜索路径,保证能正常import worker包 - 简化Celery实例配置
你已经通过include参数手动指定了任务模块路径,不需要额外调用无参数的autodiscover_tasks()(无参数调用时自动发现逻辑在你的目录结构下无法正确定位任务模块,反而可能干扰加载),直接删掉该行即可:celery_app = Celery( "worker", backend=os.getenv("CELERY_RESULT_BACKEND", "redis://redis:6000/0"), broker=os.getenv("CELERY_BROKER_URL", "amqp://guest:guest@rabbitmq:5672//"), include=['worker.celery_worker'] )
验证方式
重启Celery Worker服务后,查看启动日志中的[tasks]段落,确认get_option在已注册任务列表中,再发送任务就不会出现KeyError报错。
内容的提问来源于stack exchange,提问作者Michael Paccione
相关产品推荐
相关产品推荐

