Django之celery配置的常见问题

主要是自己学习使用celery过程中遇到的问题,自己记录使用,其他同学也可以借鉴。

一、环境准备:

Django 4.1.5
celery 5.4.0
redis 4.5.1
django-celery-results 2.5.1

其他项目需要的安装包自行安装。

二、celery的配置:

celery.py文件:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

# 设置Django的settings模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testplatform.settings')

app = Celery('testplatform')

# 使用Django的settings文件来配置Celery
app.config_from_object('django.conf:settings', namespace = 'CELERY')

# 自动从所有已注册的Django app中加载任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind = True)
def debug_task(self):
    print(f'Request: {self.request!r}')

这些网上都有,照抄就行。
下面是坑。

坑一:
celery.py文件必须放在和setting.py文件同一目录下,不要放在最外层的根目录下。如果放在最外层的根目录下会出现什么问题:1、如果命名为celery.py,那么在导入from celery import Celery时,会报错,与celery包有冲突,导致无法使用;2、如果换成别的名字,譬如celeryConfig.py(文件内的内容不变),虽然不冲突了,但是在后续起服务时会出现N多问题!!!

坑二:
与celery.py同级的__init__.py文件中需要引入app(app是celery中创建的实例)

from .celery import app

如果不这么写,后续在视图函数中,会无法使用@shared_task 装饰器,只能用@app.task ,(@shared_task相当于是@app.task的一个"快捷方式"),让人摸不着头脑。

setting.py文件:

坑一:
关于CELERY_BROKER_URL和CELERY_RESULT_BACKEND的属性,一开始问文心一言,告诉我CELERY_RESULT_BACKEND="django-celery-results",结果启动失败,后来告诉我使用CELERY_RESULT_BACKEND="django-db",虽然启动成功了,任务并没有执行。建议任务队列和结果队列都写成redis

CELERY_BROKER_URL = f'redis://:{REDIS_PW}@{REDIS_IP}:{REDIS_PORT}/0'  # Redis数据库地址
CELERY_RESULT_BACKEND = f'redis://:{REDIS_PW}@{REDIS_IP}:{REDIS_PORT}/1' 
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'  # 根据需要调整时区
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True

坑二:
排雷过程中还遇到一种做法,在INSTALLED_APPS中加入"django_celery_results",后来发现不写也可以,完全没影响,也没用到吧。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'django_celery_results'
    ]

视图函数,以及异步任务没啥好讲的,网上都有。以下是我练习时用的。

@csrf_exempt
def reset_data_api(request):
    # 调用异步任务
    result = reset_data.delay()
    task_id = result.task_id
    return JsonResponse({'status': True, 'data': {'message': '任务开始执行', 'task_id': f'{task_id}'}})

@shared_task
def reset_data():
    logger.info('开始执行任务')

    result = {
        "a": 123,
        "b": 456
        }
    logger.info('结束执行任务')
    return result

三、celery的运行

遇到最大的坑!!!!:
很难想象,celery服务器启动是正常的,任务消息也能收到,redis服务都是正常的,也没有任何报错信息,但是异步任务就是不执行,存放result的队列就是没数据,搞了大半天,晚上也睡好,想不明白。问文心一言,也完全找不到原因,各种排查。最后是在百度上搜,才发现原因:
celery正常启动后能收到任务但不执行任务的解决办法

celery在windows下的运行是有问题,需要借助gevent,eventlet 等才能实现正常功能。
pip安装 eventlet后再运行celery就行了

在这里插入图片描述
在这里插入图片描述
基本上就这些了,后面使用过程中还有的话,继续补充~~

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django-Celery是一个用于在Django应用中集成Celery任务队列的插件。它允许你将耗时的任务异步执行,从而提高应用的性能和响应速度。下面是一些使用Django-Celery的步骤: 1. 安装CeleryDjango-Celery:首先,确保你已经安装了CeleryDjango-Celery。你可以通过运行以下命令来安装它们: ``` pip install celery django-celery ``` 2. 配置Celery:在Django项目的`settings.py`文件中,添加以下配置: ```python # settings.py # 配置Celery Broker(消息代理) BROKER_URL = 'amqp://guest:guest@localhost:5672//' # 配置Celery Backend(结果存储) CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite' # 配置Celery Beat(定时任务) CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' ``` 请根据你的实际情况修改上述配置。 3. 创建Celery App:在你的Django项目中,创建一个名为`celery.py`的文件,并添加以下代码: ```python # celery.py from celery import Celery app = Celery('your_project_name') # 配置Celery app.config_from_object('django.conf:settings', namespace='CELERY') # 自动从Django app中加载任务 app.autodiscover_tasks() ``` 确保将`your_project_name`替换为你的项目名称。 4. 创建任务:在Django app中创建一个任务。例如,你可以在你的app目录下创建一个名为`tasks.py`的文件,并添加以下代码: ```python # tasks.py from celery import shared_task @shared_task def add(x, y): return x + y ``` 这是一个简单的任务示例,将两个数字相加并返回结果。 5. 启动Celery Worker:运行以下命令来启动Celery worker: ``` celery -A your_project_name worker --loglevel=info ``` 确保将`your_project_name`替换为你的项目名称。 6. 调用任务:在你的Django应用程序中,你可以通过导入任务函数并调用它来触发任务的执行。例如: ```python from your_app.tasks import add result = add.delay(1, 2) ``` 这里使用了`delay()`方法来异步调用任务。你也可以使用`apply_async()`方法来更精确地控制任务的执行。 这些是使用Django-Celery的基本步骤。你还可以配置更多高级选项,如任务重试、任务结果存储等。请参考Django-Celery的官方文档以获取更多详细信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值