学习django celery 遇到Received unregistered task of type ‘App07.tasks.hello_world‘. 错误解决过程

  1. 安装包:
    Package                    version      last version          
    celery                	   5.3.6	    5.3.6
    django-celery-results	   2.5.1	    2.5.1
    django-redis	           5.4.0	    5.4.0
    eventlet	               0.34.2	    0.34.2

  2. 目录结构
  3. setting
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        
        # celery模块
        'App07.apps.App07Config',
        'celery',
        'django_celery_results',
    ]
    
    # celery配置
    # 将数据存到redis数据库中,默认是16个数据库
    BROKER_URL = 'redis://127.0.0.1:6379/1'
    CELERY_RESULT_BACKEND = 'django-db'
    CELERY_ACCEPT_CONTENT = ['json']    # 分布式可接受的任务为json
    CELERY_TASK_SERIALIZER = 'json'     # 任务序列化和反序列化使用json
    CELERY_RESULT_SERIALIZER = 'json'   # 结果序列化使用json
    CELERY_TIMEZONE = 'Asia/Shanghai'   # 使用上海时区
    CELERY_ENABLE_UTC = False
    
    CELERYD_MAX_TASKS_PER_CHILD = 1000  # 每个worker经过1000次后,重启
    CELERY_TASK_RESULT_EXPIRES = 60*60*24 # 后端存储任务超过一天,则自动清理数据,单位位
    
    # celery定时任务
    CELERYBEAT_SCHEDULE = {
        'schedule-hello':{
            'task': 'App07.tasks.hello_world',
            'schedule': timedelta(seconds=10),
            'args': (5,)
        }
    }

  4. celery.py
    import os
    from datetime import timedelta
    
    from celery import Celery
    
    from day02 import settings
    
    # 设置工程配置信息
    os.environ.setdefault('DJANGO_SETTINGS_MODULE','day02.settings')
    
    # 配置方法一
    # # 消息中间件,密码是你redis的密码
    # # broker='redis://:123456@127.0.0.1:6379/2' 密码123456
    # broker = 'redis://127.0.0.1:6379/0'  # 无密码
    # # 任务结果存储
    # # backend = 'redis://127.0.0.1:6379/1'
    # backend = 'django-db'
    # # 包含任务的所有模块的导入路径:
    # task_module = [
    #     # 'App07.async_task',  # 写任务模块导入路径,该模块主要写异步任务的方法
    #     'App07.tasks',  # 写任务模块导入路径,该模块主要写定时任务的方法
    # ]
    # 实例化celery.第一个参数是应用名
    # app = Celery('mycelery')
    # app = Celery('task',broker=broker,backend=backend,include=task_module)
    # 指定时区
    # app.conf.timezone = 'Asia/Shanghai'
    # # 定时任务配置
    # app.conf.beat_schedule = {
    #     'schedule-hello':{
    #         'task': 'App07.tasks.hello_world',
    #         'schedule': timedelta(seconds=10),
    #         'args': (5,)
    #     }
    # }
    
    # 方法二
    # 实例化celery.第一个参数是应用名
    app = Celery('mycelery')
    # 指定时区
    app.conf.timezone = 'Asia/Shanghai'
    # 指定setting的配置源,用的是项目setting的配置信息。
    app.config_from_object('django.conf:settings')
    # 让celery自动发现我们的任务task
    # 需要在应用app下面建tasks.py
    app.autodiscover_tasks()
    # 从已经安装的app中查找任务
    # app.autodiscover_tasks(settings.INSTALLED_APPS)
    
    
    
    

  5. urls.py
    from django.urls import path
    
    from App07 import views
    
    app_name = 'App07'
    urlpatterns = [
        path('',views.index,name='index'),
        # celery
        path('task/',views.exec_task,name='task'),
        # path('active/<token>/',views.check_active,name='active'),
    ]

  6. views.py
    from django.http import HttpResponse
    from django.shortcuts import render
    
    from App07.tasks import hello_world
    
    
    # Create your views here.
    def index(request):
        return HttpResponse('app07启动')
    
    def exec_task(request):
        # 把任务添加到任务队列,并延时5s执行
        # hello_world(5)
        hello_world.delay(5)
        return HttpResponse('celery测试')
    
    
    

  7. tasks.py 解决问题 关键是:
    @app.task(name='tasks.hello_world') 标红的错误。改成
    @app.task(name='App07.tasks.hello_world') 或者 直接
    @shared_task 也可以。问题解决。
    import time
    
    from celery import shared_task
    from App07.celery import app
    
    # @shared_task
    @app.task(name='tasks.hello_world')
    def hello_world(n):
        for i in range(n):
            print('hello world')
            time.sleep(1)

    celery 和 beat 启动

    # worker 启动
    #windows系统
    celery -A celery_task worker -l info  -P  eventlet
    #linux系统
    celery -A celery_task worker -l info 
    
    
    # beat 启动
    celery -A celery_task beat -l info

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值