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

标签:python,celery,超时取消
0
投稿

猜你喜欢

  • python源码剖析之PyObject详解

    2023-08-02 14:07:03
  • 解决Linux下Tomcat向MySQL插入数据中文乱码问题

    2024-01-29 13:06:36
  • 一步步教你用python给女朋友写个微信自动提醒的程序

    2022-09-03 16:50:25
  • Python一句代码实现找出所有水仙花数的方法

    2021-10-09 08:10:44
  • PHP利用func_get_args和func_num_args函数实现函数重载实例

    2023-06-15 09:25:51
  • 解决MySQL不允许从远程访问的方法

    2010-03-18 15:39:00
  • python字符串的index和find的区别详解

    2022-09-17 17:58:47
  • nvm版本导致npm install报错Unexpected token '.'的解决办法

    2024-05-05 09:21:04
  • python 根据时间来生成唯一的字符串方法

    2022-12-25 14:49:48
  • MySQL的数据类型和建库策略分析详解

    2024-01-14 11:33:30
  • 打造设计你自己的字体

    2007-12-12 13:16:00
  • Goland 的安装及激活教程(window、linux下安装)

    2024-05-08 10:51:51
  • Python数据分析 Pandas Series对象操作

    2021-07-17 20:18:52
  • C#中使用SQLite数据库的方法介绍

    2024-01-26 00:31:49
  • IntelliJ IDEA卡死,如何优化内存

    2023-07-04 12:10:27
  • Go Redis客户端使用的两种对比

    2024-05-09 09:31:15
  • 深入解析mysql.sock不见的问题

    2024-01-26 21:30:28
  • Python使用OpenCV对图像进行缩放功能

    2022-05-06 03:47:51
  • python 实现红包随机生成算法的简单实例

    2022-07-07 17:32:48
  • windows下Mysql多实例部署的操作方法

    2024-01-19 16:33:11
  • asp之家 网络编程 m.aspxhome.com