Django-Celery异步和redis数据库的配置

后端
观看:0
文章标签:#celery#django#异步#redis
最后更新:2025年08月08 14:57
celery和redis组合,可以完成任务异步和排队的情况

比如一个任务完成需要10分钟,设备仅支持同时运行2个任务,这样第三个任务进行,如果不写异步,就会卡死!

现在通过组合这两个,就能自动进行任务排队。

安装

shell
pip install celery
pip install django-celery-beat
pip install django-celery-results

pip install redis
pip install django-redis

在环境内安装这些包

配置

定义配置内容

在django项目的settings中,写一些配置内容:

python
# 设置redi后端缓存
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
# 在这里注册
INSTALLED_APPS = [
    # ——— Django 内置 Apps ———
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ——— 你的自定义 App(必须在 drf-tus 之前) ———
    'appchemnote',
    'appuser',
    # ——— 第三方库 ———
    'celery',
    'django_celery_beat',
    'django_celery_results',
    'django.contrib.postgres',

]

# 下面配置详细的信息
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'  # 消息代理地址
CELERY_RESULT_BACKEND = 'django-db'  # 使用 Django 数据库作为结果后端  安装完成后记得迁移一下

CELERY_WORKER_CONCURRENCY = 2  # Worker并发数量,一般默认CPU核数,可以不设置
CELERYD_FORCE_EXECV = True  # 非常重要,有些情况下可以防止死锁
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100  # celery 的 worker 执行多少个任务后进行重启操作
CELERY_TASK_TRACK_STARTED = True  # 设置任务更新状态:启用后,任务开始执行时,状态会从 "PENDING" 更新为 "STARTED"
# CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24  # 任务结果过期时间,秒  设置为0表示不过期
CELERY_TASK_RESULT_EXPIRES = 0  # 任务结果过期时间,秒  设置为0表示不过期

CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True  # 断开重新连接
CELERY_BROKER_CONNECTION_MAX_RETRIES = 10  # 默认重新连接 100 次

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'               # 可选:设置时区

发现任务

对于celery,需要写一个整体入口

在项目的settings目录内,新建一个celery.py文件

注意,其中的项目名称需要修改!!!---根据自己的项目定

python
import os
from celery import Celery
from celery.schedules import crontab

# 设置环境变量--获取django自带的,否则aiochemserver.settings.dev
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'aiochemserver.settings')

# 实例化,需要改成自己的项目名称
app = Celery('aiochemserver')

# 从 Django settings 中加载 Celery 配置
app.config_from_object('django.conf:settings', namespace='CELERY')

# 调度器,自动执行某些任务(比如清理验证码、临时图片等)
app.conf.beat_schedule = {}

# 自动发现任务
app.autodiscover_tasks()


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

然后需要在项目内的__init__.py内,注册这个celery:

注意,这个文件是settings.py同级内的那个,如果你做了生产和开发环境的分割,不要搞混了(别写在settings文件夹内的那个文件内)

python
from .celery import app as celery_app

__all__ = ('celery_app',)

写测试任务

对于每个异步任务,需要在对应的app内,新建一个tasks.py,在里面写需要异步的任务:

python
from celery import shared_task

@shared_task(bind=True, soft_time_limit=600)  # 10分钟超时
def save_note(self):
  print('这里进行耗时的任务')

关于异步的状态和自动向前端回复任务状态和进度,使用channels进行ws通信,看另一篇文章:

请登录后再发表评论
🔍 快速搜索
文章推荐
基于文本相似性

没有推荐的文章...

文章推荐
化学结构同出现

没有对应的文章...

AioChem © 2025

晋ICP备2025060790号-1