python使用celery实现订单超时取消
作者:A༒࿈ 发布时间:2023-09-25 00:30:42
本文实例为大家分享了celery实现订单超时取消的具体代码,供大家参考,具体内容如下
Celery官方文档中关于定时任务使用的说明
项目目录结构
我们需要新增一个任务目录,例如order:
celey_tasks/
├── config.py
├── __init__.py
├── main.py
├── order/
├── __init__.py
└── tasks.py
在main.py中,注册任务目录【注意,接下来后面我们使用django的模型处理,所以必须对django的配置进行引入】
import os
from celery import Celery
# 1. 创建示例对象
app = Celery("luffy")
# 2. 加载配置
app.config_from_object("celery_tasks.config")
# 3. 注册任务[自动搜索并加载任务]
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["celery_tasks.order"])
# 4. 在终端下面运行celery命令启动celery
# celery -A 主程序 worker --loglevel=info
# celery -A celery_tasks.main worker --loglevel=info
接下来,在order任务目录下, 创建固定名字的任务文件tasks.py,代码:
from celery_tasks.main import app
@app.task(name="check_order")
def check_order():
print("检查订单是否过期!!!")
接下来,我们需要把这个任务设置定时任务,所以需要借助Celery本身提供的Crontab模块。
在配置文件中,对定时任务进行注册:
# 任务队列的链接地址
broker_url = 'redis://127.0.0.1:6379/15'
# 结果队列的链接地址
result_backend = 'redis://127.0.0.1:6379/14'
from celery.schedules import crontab
from .main import app
# 定时任务的调度列表,用于注册定时任务
app.conf.beat_schedule = {
# Executes every Monday morning at 7:30 a.m.
'check_order_outtime': {
# 本次调度的任务
'task': 'check_order', # 这里的任务名称必须先到main.py中注册
# 定时任务的调度周期
# 'schedule': crontab(minute=0, hour=0), # 每周凌晨00:00
'schedule': crontab(), # 每分钟
# 'args': (16, 16), # 注意:任务就是一个函数,所以如果有参数则需要传递
},
}
接下来,我们就可以重启Celery并启用Celery的定时任务调度器
先在终端下,运行celery的定时任务程序,以下命令:
celery -A celery_tasks.main beat # ycelery.main 是celery的主应用文件
然后再新建一个终端,运行以下命令,上面的命令必须先指定:
celery -A celery_tasks.main worker --loglevel=info
定时任务
经过上面的测试以后,我们接下来只需改造上面的任务函数,用于判断修改订单是否超时。
要完成订单的任务功能,如果需要调用django框架的模型操作,那么必须针对django框架进行配置加载和初始化。
main.py,代码
import os
from celery import Celery
# 1. 创建示例对象
app = Celery("luffy")
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
# 在当前clery中启动django框架,对django框架进行进行初始化
import django
django.setup()
# 2. 加载配置
app.config_from_object("celery_tasks.config")
# 3. 注册任务[自动搜索并加载任务]
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["celery_tasks.sms","celery_tasks.order"])
# 4. 在终端下面运行celery命令启动celery
# celery -A 主程序 worker --loglevel=info
# celery -A celery_tasks.main worker --loglevel=info
注意,因为在django中是有时区配置的,所以,我们在django框架配置中也要修改时区配置。
任务代码tasks.py的实现:
from celery_tasks.main import app
from orders.models import Order
from datetime import datetime
from django.conf import settings
@app.task(name="check_order")
def check_order():
# 查询出所有已经超时的订单
# 超时条件: 当前时间 > (订单生成时间 + 超时时间) =====>>>> (当前时间 - 超时时间) > 订单生成时间
now = datetime.now().timestamp()
timeout_number = now - settings.ORDER_TIMEOUT
timeout = datetime.fromtimestamp(timeout_number)
timeout_order_list = Order.objects.filter(order_status=0, created_time__lte=timeout)
for order in timeout_order_list:
order.order_status = 3
order.save()
配置文件,settings/dev.py,代码:
# 设置订单超时超时的时间[单位: 秒]
ORDER_TIMEOUT = 12 * 60 * 60
来源:https://blog.csdn.net/qq_45066628/article/details/114500783


猜你喜欢
- Apache SkyWalking 在本月初发布了 SkyWalking Backend、UI 的 9.2.0 版本 以及&nbs
- MapPathMapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。语法Server.MapPath( Path ) 参
- 一、为何使用Tkinter而非PyQt众所周知,在Python中创建图形界面程序有很多种的选择,其中PyQt和wxPython都是很热门的模
- 本文主要介绍了Opencv图片生成视频,分享给大家,具体如下:生成视频import random as rdimport cv2 as cv
- 进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念:1.定义进程是具有一定独立功能的程序关
- 如下所示:# -*- coding: utf-8 -*-import os import pandas as pdimport numpy
- 什么是自省?在日常生活中,自省(introspection)是一种自我检查行为。在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么
- 想学习Python3,但是暂时又离不开Python2。在Windows上如何让它们共存呢?目前国内网站经常会让大家把其中一个python.e
- 删除一,你可以先把类型为varchar的字段该名,再加以个字段为要该为date的字段名相同,二,1,测试表create table TEST
- 我们平时生活的娱乐中,看电影是大部分小伙伴都喜欢的事情。周围的人总会有意无意的在谈论,有什么影片上映,好不好看之类的话题,没事的时候谈论电影
- 前面的话分页导航几乎在每个网站都可见,好的分页能给用户带来好的用户体验。本文将详细介绍Bootstrap分页概述在Bootstrap框架中提
- ARIMA模型预测餐厅销量import numpy as npimport pandas as pdimport matplotlib.py
- reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中。reduce函数先从列表(或序列
- 前言Django数据层提供各种途径优化数据的访问,一个项目大量优化工作一般是放在后期来做,早期的优化是“万恶之源”,这是前人总结的经验,不无
- 每个程序员都绝对必须知道的关于字符集和Unicode的那点儿事(别找借口!)Unicode与字符集你曾经是否觉得HTML中的"Co
- 搞社区APP的时候,需要实现这个功能: String filetext = "//@张小名: 25分//@李小花: 43分//@王
- AttribteError: ‘module' object has no attribute xxx'描述:模块没有相关属
- 如下所示:#加载词典def load_dict_from_file(filepath): _dict = {} tr
- Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等。其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这
- 准备篇:1、配置防火墙,开启80端口、3306端口vi /etc/sysconfig/iptables-A INPUT -m state -