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

深圳做网站找谁/宁波seo服务快速推广

深圳做网站找谁,宁波seo服务快速推广,网站建设专业的,中国最新军事新闻昨天视频文章目录 前言⭐✨💫🔥📖一、Celery⭐1.基本概念及介绍:✨2.使用步骤💫 二、订单超时 取消订单(Celery)🔥具体实现流程📖 前言⭐✨💫🔥📖 在构建复…

在这里插入图片描述


文章目录

  • 前言⭐✨💫🔥📖
  • 一、Celery⭐
    • 1.基本概念及介绍:✨
    • 2.使用步骤💫
  • 二、订单超时 取消订单(Celery)🔥
    • 具体实现流程📖


前言⭐✨💫🔥📖

    在构建复杂的Web应用,如线上教育平台时,异步任务处理与定时任务调度成为提升性能和用户体验的关键。Celery 作为分布式任务队列框架,以其高效、灵活和可扩展性在Python项目中广泛应用。

    本文将简述Celery的基本概念,并详细指导如何在Django项目中集成Celery,以实现订单超时自动取消的功能。同时,我们还将探讨如何设置定时任务,对成功和失败的订单进行统一处理,以优化业务流程和提高系统自动化水平。


一、Celery⭐

在这里插入图片描述

项目仓库:https://github.com/celery/celery/
官方文档:https://docs.celeryproject.org/en/latest/
中文文档(3.1):http://docs.jinkan.org/docs/celery/getting-started/index.html

1.基本概念及介绍:✨

  • Celery是一个由Python编写的分布式任务队列和异步处理框架,它使得开发者能够轻松地在后台处理耗时任务,而不会阻塞主程序的执行。
  • Celery的设计基于生产者消费者模型,通过消息中间件(Broker)来协调任务的发布和执行。

Celery的核心组件包括:

  • 1.任务(Tasks):定义了要异步执行的功能。它们通常是一个普通的Python函数,通过装饰器标记为Celery任务
  • 2.工作者(Workers):运行在后台的进程,不断地从消息队列中取出任务并执行。你可以运行多个工作者来并行处理任务。
  • 3.消息中间件(Message Broker):用于***接收任务并将它们放入队列中,同时负责结果的存储。Celery 支持多种中间件,如RabbitMQ、Redis、Amazon SQS等。
  • 4.定时任务配制(beat):三种模式 cron模式、date模式、interval模式
  • 5.任务结果后端(Result Backend):用于存储任务的结果,以便任务完成后可以查询。后端可以是数据库、缓存系统等,Celery支持包括Redis、RabbitMQ、SQLAlchemy在内的多种存储方式。

Celery的整体流程:

  • 应用程序将一个任务添加到任务队列中。
  • 消息中间件接收这个任务并将它存储在适当的消息队列里。
  • Celery 工作者监听这些队列,一旦发现新任务,就会取出并执行它。
  • 任务执行的结果可以被存储在结果后端,供后续查询。

    Celery 支持任务的链式执行、定时任务(使用celery beat)、任务优先级设置、任务结果的跟踪和重试机制等高级特性,非常适合需要高性能异步处理和任务调度的场景。


2.使用步骤💫

1.创建Celery:web_back/celery.py

import os
from celery import Celery# 必须在实例化celery应用对象之前执行
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web_back.settings')# 实例化celery应用对象
app = Celery('web_back')
# 指定任务的队列名称
app.conf.task_default_queue = 'Celery'
# 也可以把配置写在django的项目配置中
app.config_from_object('django.conf:settings', namespace='CELERY') # 设置django中配置信息以 "CELERY_"开头为celery的配置信息
# 自动根据配置查找django的所有子应用下的tasks任务文件
app.autodiscover_tasks()

2.使用Celery:web_back/__init__.py

import pymysql
pymysql.version_info=(1,4,3,"final",0) # 指定了pymysql的版本:1.4.3,按照版本修改
pymysql.install_as_MySQLdb()from .celery import app as celery_app__all__ = ['celery_app']

3.settings.py 配置

# Celery配置
# from kombu import Exchange, Queue
# 设置任务接受的类型,默认是{'json'}
CELERY_ACCEPT_CONTENT = ['application/json']
# 设置task任务序列列化为json
CELERY_TASK_SERIALIZER = 'json'
# 请任务接受后存储时的类型
CELERY_RESULT_SERIALIZER = 'json'
# 时间格式化为中国时间
CELERY_TIMEZONE = 'Asia/Shanghai'
# 是否使用UTC时间
CELERY_ENABLE_UTC = False
# 指定borker为redis 如果指定rabbitmq CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
# 指定存储结果的地方,支持使用rpc、数据库、redis等等,具体可参考文档
# CELERY_RESULT_BACKEND = 'db+mysql://scott:tiger@localhost/foo'
# mysql 作为后端数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 设置任务过期时间 默认是一天,为None或0 表示永不过期
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 设置worker并发数,默认是cpu核心数
# CELERYD_CONCURRENCY = 12
# 设置每个worker最大任务数
CELERYD_MAX_TASKS_PER_CHILD = 100
# 指定任务的位置
CELERY_IMPORTS = ('base.tasks',
)
# 使用beat启动Celery定时任务
# schedule时间的具体设定参考:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html# 定时任务
CELERY_BEAT_SCHEDULE = {"orders_notpay": {  # 定时任务'task': 'base.tasks.cancelorders','schedule': 3,  # 定时任务的调用时间,10表示每隔10秒调用一次任务,5*60表示每5分钟# "schedule": crontab(hour=7, minute=30, day_of_week=1),,  # 定时任务的调用时间,每周一早上7点30分调用一次add任务},"syn_mysqlEs": {  # 定时任务:每一分钟同步一次mysql到es的数据'task': 'base.tasks.syn_mysql_es','schedule': 3,  # 定时任务的调用时间,10表示每隔10秒调用一次任务,5*60表示每5分钟# "schedule": crontab(hour=7, minute=30, day_of_week=1),,  # 定时任务的调用时间,每周一早上7点30分调用一次add任务},}

4.设置tasks 任务:

#base/tasks.py
from celery import shared_task
from ronglianyunapi import send_sms as sms
# 记录日志:
import logging
logger = logging.getLogger("django")@shared_task(name="send_sms")
def send_sms(tid, mobile, datas):"""异步发送短信"""try:return sms(tid, mobile, datas)except Exception as e:logger.error(f"发送短信失败: {e}")

5.启动定时任务:

  • 第一个终端:celery -A web_back worker -l INFO -P eventlet
  • 第二个终端:celery -A web_back beat

二、订单超时 取消订单(Celery)🔥

实现流程:

  • 1.生成订单把当前时间+1800,和订单号存入队列中
  • 2.在支付完的回调接口中,同步根据订单号查询订单,根据查询结果改变订单状态。异步从请求中获取状态,100000支付成功,队列中删除订单号
  • 3.此时队列中的就是没支付的,1分钟执行一次,查询时间<当前时间,说明已经过期了,把订单改为失败状态,积分优惠券恢复

具体实现流程📖

1.生成订单接口 OrderView
在这里插入图片描述
2.在支付完的回调接口中,同步根据订单号查询订单,根据查询结果改变订单状态。异步从请求中获取状态,100000支付成功,队列中删除订单号
在这里插入图片描述

Celery定时任务:

  • 订单超时取消订单
  • 处理订单成功队列
  • 处理订单失败队列
@shared_task
def cancelorders():# 获取订单号 0 小于等于int(time.time())# 遍历订单号列表# 根据订单号查询订单表,把订单更新为失败状态# 查看订单是否使用积分和优惠券,如果使用更新,写入积分记录表,用户表中的积分+,优惠券+orderno = r.get_str("orderno")order = OrdersModel.objects.filter(transaction=orderno).first()pay_status = order.pay_statusif pay_status == 1: #生成订单-未支付状态order.orders_status = 7 #订单-->取消状态#...print("取消订单操作")
@shared_task
def ordersuccess():#读取成功的队列,获取到订单号len = r.list_len("ordersuccess")while len > 0:sid = r.list_pop("ordersuccess")# 根据订单号查询订单order = OrdersDetailModel.objects.filter(orders_id=sid).first()# 更新用户课程表UserCourseModel.objects.create(user_id=order.user_id,course_id=order.course_id)# 更新用户课程章节表UserCourseChapterModel.objects.create(user_id=order.user_id,course_id=order.course_id,name=order.course.name)print("订单成功时,更新用户课程表和用户课程章节表")@shared_task
def orderfail():# 读取失败的队列,获取到订单号,len = r.list_len("orderfail")while len > 0:fid = r.list_pop("orderfail")# 根据订单号查询订单order = OrdersModel.objects.filter(orders_id=fid).first()# 更新积分记录表、用户表中总积分、优惠券srecord = ScoreRecordModel.objects.filter(user_id=order.user_id).first()srecord.type = 1srecord.score = order.scoresrecord.save()user = UsersModel.objects.filter(user_id=order.user_id).first()user.points += order.scoreuserCoupon = UserCouponModel.objects.filter(user_id=order.user_id).first()userCoupon.status = "未使用"print("订单失败时,更新数据完成")

在这里插入图片描述

相关文章:

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…...

CSS3 教程

CSS3 教程 引言 CSS3&#xff0c;即层叠样式表的第三代&#xff0c;是网页设计和开发中不可或缺的技术之一。它为HTML元素提供了丰富的样式定义&#xff0c;使得网页不仅内容丰富&#xff0c;而且外观美观、交互性强。本教程将详细介绍CSS3的基础知识、高级特性以及最佳实践&…...

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…...

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…...

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…...

Java8-21新特性

简介 由于Java官方最近更新越来越频繁&#xff0c;而长期支持维护的版本LTS版每隔几年才推出一个&#xff0c;大规模商用的JDK只可能选择LTS版&#xff0c;因此这里只简单记录JDK8&#xff0c;11&#xff0c;17&#xff0c;21。 jdk8 Lambda表达式&#xff1a; Lambda表达式…...

NodeJS系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 有没有写过Koa中间件&#xff0c;说一下中间件原理&#xff0c;介绍下自己写过的中间件 koa本来就是一个轻量级框架&#xff0c;本身支持的功能并不多&#xff0c;功能都是通过中间件来实现不同的需求。开发者可以通…...

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…...

昇思25天学习打卡营第13天 | mindspore 实现 ShuffleNet 图像分类

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第 13 天&#xff1b;主要内容也依据 mindspore 的学习记录。 2. 迁移学习介绍&#xff1a; mindspore 实现 ShuffleNet 图像分类&#xff1b; ShuffleNet 基本介绍&#xff1a; ShuffleNetV1 是旷视科技提…...

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…...

BUUCTF逆向wp [MRCTF2020]Xor

第一步 查壳&#xff0c;该题是32位&#xff0c;无壳。 第二步 跟进main&#xff0c;发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息&#xff1a;flag的长度为27&#xff08;下面是对本条指令cmp edx 27指令的应用…...

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185...

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…...

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件&#xff1a;(从官网获取或者网上) 1、zlib-1.2.3.tar.gz &#xff1a;通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…...

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算&#xff1a; 轮胎每转一圈的脉冲数取决于编码器的分辨率&#xff0c;可由下面公式进行计算&#xff1a; PPR是电机的线数 以GA25-370电机为例。 图片来源&#xff1a;第四节&#xff1a;STM32定时器&#xff08;4.JGA25-370霍尔编码器…...

【已解决】服务器无法联网与更换镜像源

目录 问题描述&#xff1a; 1.修改网卡的 DNS1 和 DNS2 2.修改DNS列表 3.重启网络服务 4.切换镜像源 4.1备份原镜像源 4.2下载阿里云镜像源 4.3替换无法使用的域名 4.4刷新软件包缓存 4.5其他镜像源 5.阿里云镜像源开发者社区说明 6.阿里云DNS网址 7.DNS域名服务器…...

android11 屏蔽usb通过otg转接口外接鼠标设备

硬件平台&#xff1a;QCS6125 软件平台&#xff1a;Android11 需求&#xff1a;Android设备通过接usb转接线连接鼠标功能屏蔽。 考虑到屏蔽的层面可以从两个层面去做&#xff0c;一个是驱动层面不识别&#xff0c;一个就是Android系统层面不识别加载&#xff0c;本篇只讲后者。…...

HAL库源码移植与使用之RTC时钟

实时时钟(Real Time Clock&#xff0c;RTC)&#xff0c;本质是一个计数器&#xff0c;计数频率常为秒&#xff0c;专门用来记录时间。 普通定时器无法掉电运行&#xff01;但RTC可由VBAT备用电源供电&#xff0c;断电不断时 这里讲F1系列的RTC 可以产生三个中断信号&#xff…...

GIT命令学习 一

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…...

VS+QT 打包可执行文件.exe

切换成release版本&#xff0c;同时更改项目属性中release配置下的各个属性&#xff0c;确保匹配 重新生成解决方案&#xff0c;将生成的.exe复制到一个空白文件夹中 执行&#xff1a; cd D:\QT\5.12.10\msvc2015_64\binwindeployqt C:\Users\DELL\Desktop\serials\MainWind…...

Android笔试面试题AI答之Activity(2)

答案仅供参考&#xff0c;大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期&#xff1f;1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化&#xff1f;1.默认行为&#xff08;未设置androi…...

来自Transformers的双向编码器表示(BERT) 通俗解释

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; 目录 1. 从上下文无关到上下文敏感2. 从特定于任务到不可知任务3. BERT&#xff1a;把两个最好的结合起来4. BERT的输入表示5. 掩蔽语言模型&#xff08;Masked Language Modeling&#xff09;6. 下一句预测&am…...

代码随想录第十六天|贪心算法(2)

目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...

花几千上万学习Java,真没必要!(二十二)

1、final关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …...

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址&#xff1a;https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码&#xff1a;hm30 烧录过程&#xff1a; 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录&#xff0c;双击运行RKDevInfo…...

1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)

1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下&#xff0c;我们可以通过构建一个卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;来实现该任务。以下…...

Windows如何使用Python的sphinx

在Windows上使用Python的Sphinx进行文档渲染和呈现&#xff0c;‌可以遵循以下步骤进行操作&#xff1a;‌ 安装Python&#xff1a;‌首先&#xff0c;‌确保你的Windows系统上已经安装了Python。‌你可以从Python的官方网站下载并安装适合你系统&#xff08;‌32位或64位&…...

C++ STL nth_element 用法

一&#xff1a;功能 将一个序列分为两组&#xff0c;前一组元素都小于*nth&#xff0c;后一组元素都大于*nth&#xff0c; 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二&#xff1a;用法 #include <vector> #include <a…...

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

C# —— HashTable

集合collections命名空间&#xff0c;专门进行一系列的数据存储和检索的类&#xff0c;主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定&#xff0c; 类型固定 通过索引值来进行访问 ArrayList动态数组&#xff0c…...