当前位置: 首页 > news >正文

Django中使用Celery(通用方案、官方方案)

Django中使用Celery(通用方案、官方方案)

目录

  • Django中使用Celery(通用方案、官方方案)
    • 通用方案
      • 场景
      • 前置准备
      • 完整代码
    • Celery官方方案
      • 【1】注册celery配置
      • 【2】创建celery文件
      • 【3】init注册
      • 【4】添加任务
      • 【5】启动worker异步任务
      • 【6】在view中调用

通用方案

场景

现在定义了一张图片表,要求每隔一段时间就将表内容更新进缓存库中

前置准备

  • 安装模块
pip install Django4.2.13
pip install celery
pip install cache
pip install eventlet
pip install redis
  • 定义图片表
from django.db import modelsclass Display(models.Model):title = models.CharField(max_length=16, unique=True, verbose_name='名称')image = models.ImageField(upload_to='banner', verbose_name='图片')link = models.CharField(max_length=64, verbose_name='跳转链接')info = models.TextField(verbose_name='详情')
  • 路径结构

image-20240517163748104

完整代码

# tasks.py
from celerys import app
from datetime import timedeltaapp.conf.beat_schedule = {'update_cache_every_30_seconds': {'task': 'celerys.update_cache','schedule': timedelta(seconds=30),},
}
# celerys.py
import os
import sys# 执行文件必须与Django配置的环境变量同级(manage.py)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Luffy_API.settings.dev')
import django
django.setup()from app.models import Display
from app.serializer import DisplaySerializer
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
from django.core.cache import cachebroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery('celery',broker=broker,backend=backend)@app.task
def update_cache():queryset = Display.objects.all()serializer = DisplaySerializer(instance=queryset, many=True)cache_data = queryset.values()cache.set('display', cache_data)return '缓存已更新'
  • 执行命令
celery -A celerys worker -l info -P eventlet
celery -A tasks beat -l info

Celery官方方案

【1】注册celery配置

settings中添加Celery的配置文件

# 用redis创建队列库1
CELERY_BROKER_URL='redis://127.0.0.1:6379/1'
# 用redis创建结果存储库2
CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2'
CELERY_ACCEPT_CONTENT=['json']
CELERY_TASK_SERIALIZER='json'
# 结果序列化方案
CELERY_RESULT_SERIALIZER='json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES=60 * 60 * 24
# 时区配置
CELERY_TIMEZONE='Asia/Shanghai'

【2】创建celery文件

新建tasks文件和celerys文件

  • 目录结构

image-20240518235114242

【3】init注册

在根目录下的__init__.py文件中注册celerys文件,如果不加则会自动识别根目录中的celery文件而不是我们创建的celerys

from .celerys import app as celery_app__all__=('celery_app',)

【4】添加任务

tasks.py文件中存储要被执行的异步文件

from celerys import app@add.task()
def add(a, b):return a + b

celerys.py存放celery的配置文件

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django_API.settings.dev')
import django
from celery import Celery, shared_task
from django.conf import settings# 启动worker的命名
app = Celery('Django_API')# 自动检索前缀为CELERY的配置
app.config_from_object('django.conf:settings', namespace='CELERY')# 自动搜索每个app中的tasks.py文件
app.autodiscover_tasks()

【5】启动worker异步任务

启动worker

celery -A Django_API worker -l info -P eventlet

【6】在view中调用

from rest_framework.views import APIView
from rest_framework.response import Response
from .tasks import addclass TestView(APIView):def get(self, request):res = add.delay(500, 2)return Response(f'res:{res}')

相关文章:

  • 一顿五元钱的午餐
  • 141.字符串:重复的字符串(力扣)
  • Stable Diffusion教程
  • Midjourney绘画关键词参数汇总(二)
  • currentTarget指向监听者Target:指向触发者
  • TikTok矩阵管理系统:品牌增长的新引擎
  • Php composer 基础教程
  • 基于springboot+vue的学生考勤管理系统
  • FreeRTOS_同步互斥与通信_队列集_学习笔记
  • MySQL实战——主从异步复制搭建(一主一从)
  • 解决ModuleNotFoundError: No module named ‘open_clip‘问题
  • 三维空间坐标系变换(旋转平移)
  • python实现520表白图案
  • LLama3 | 一. 本地 Web Demo 部署
  • 手写tomcat(Ⅱ)——Socket通信+tomcat静态资源的获取
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [nginx文档翻译系列] 控制nginx
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • const let
  • eclipse(luna)创建web工程
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • magento 货币换算
  • maya建模与骨骼动画快速实现人工鱼
  • Python - 闭包Closure
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Selenium实战教程系列(二)---元素定位
  • 百度小程序遇到的问题
  • 编写高质量JavaScript代码之并发
  • 那些被忽略的 JavaScript 数组方法细节
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 学习Vue.js的五个小例子
  • raise 与 raise ... from 的区别
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​批处理文件中的errorlevel用法
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (8)STL算法之替换
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (七)c52学习之旅-中断
  • (三)Honghu Cloud云架构一定时调度平台
  • (学习日记)2024.01.09
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 2.1路线图
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core与存储过程(一)
  • .NET DataGridView数据绑定说明
  • .NET Framework杂记
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • ?.的用法