Celery未注册任务错误:dividends_project.run_yahoo_request_for_stock_info_task
解决Celery未注册任务KeyError问题
问题定位
错误KeyError: 'dividends_project.run_yahoo_request_for_stock_info_task'说明Celery Worker无法识别该任务名称,核心原因是任务注册逻辑冲突、Worker未正确加载任务或队列残留旧缓存。
具体解决步骤
1. 移除Celery配置中的重复任务加载逻辑
你的celery.py同时使用了include参数和autodiscover_tasks,两者功能重叠会导致任务注册异常。修改celery.py:
import os from celery import Celery from django.apps import apps os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dividends_project.settings") # 移除include参数,避免与autodiscover_tasks冲突 app = Celery("dividends_project") app.config_from_object("django.conf:settings", namespace="CELERY") app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
2. 强制任务绑定到项目Celery App
shared_task依赖自动绑定机制,可能因Django初始化顺序问题导致任务未注册到正确的App。修改dividends_info/tasks.py:
import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dividends_project.settings') import django django.setup() import time # 替换shared_task为直接从项目Celery App导入的装饰器 from dividends_project.celery import app from celery import group from dividends_info.functions.stock_info import save_stock_info_data from dividends_info.models import StockInfo @app.task() # 用app.task替代shared_task def run_yahoo_request_for_stock_info_task(ticker): print(locals().keys()) print("celery task ran for ticker {ticker}".format(ticker=ticker)) stock, created = StockInfo.objects.get_or_create(ticker=ticker) save_stock_info_data(ticker, stock) tickers = ['A', 'AA', 'AAC', 'AAN', 'AAP', 'AAT', 'AB', 'AAB', 'ABBV', 'ABC'] @app.task() def run_task(): tasks = [] for ticker in tickers: tasks.append(run_yahoo_request_for_stock_info_task.signature((ticker,))) print("start chain_call") t = group(*tasks).apply_async() if __name__ == '__main__': run_task()
3. 清理队列缓存并重启Worker
- 停止所有Celery Worker进程:
pkill -f 'celery worker' - 清空Redis中Celery相关队列(若Redis仅用于Celery,可直接执行):
若Redis有其他数据,精准删除Celery键:redis-cli FLUSHDBredis-cli KEYS "celery*" | xargs redis-cli DEL - 重新启动Worker:
python3 -m celery -A dividends_project worker --pool=gevent --concurrency=40 --loglevel=info
4. 验证Worker是否加载任务
启动Worker后,查看日志中Registered tasks:部分,确认存在dividends_info.tasks.run_yahoo_request_for_stock_info_task条目。若未出现,检查dividends_info是否已添加到settings.py的INSTALLED_APPS中。
内容的提问来源于stack exchange,提问作者codyc4321
相关产品推荐
相关产品推荐

