You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-cli FLUSHDB
    
    若Redis有其他数据,精准删除Celery键:
    redis-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:24:50