使用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
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django 可以使用 Celery 实现异步任务处理和分布式任务处理。下面是一些实现步骤: 1. 安装 Celery ```bash pip install celery ``` 2. 在 Django 项目中添加 Celery 配置 在 Django 项目目录下创建一个名为 `celery.py` 的文件,内容如下: ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` 3. 在 Django 项目中配置 Celery 的 Broker 和 Backend 在 Django 项目的 `settings.py` 文件中添加以下配置: ```python # Broker 配置 CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672/' # Backend 配置 CELERY_RESULT_BACKEND = 'django-db' ``` 4. 创建 Celery 任务 在 Django 项目中创建一个 `tasks.py` 文件,定义 Celery 任务。例如: ```python from celery import shared_task @shared_task def add(x, y): return x + y ``` 5. 启动 Celery Worker 使用以下命令启动 Celery Worker: ```bash celery -A your_project worker -l info ``` 6. 在 Django 视图中调用 Celery 任务 可以在 Django 视图中使用以下代码调用 Celery 任务: ```python from your_app.tasks import add result = add.delay(4, 4) ``` 7. 监控 Celery 任务的执行情况 可以使用以下命令启动 Flower 监控 Celery 任务的执行情况: ```bash celery -A your_project flower ``` 以上是 Django 使用 Celery 实现分布式的基本步骤。需要注意的是,如果使用 Django 的 ORM,需要在 Celery 的配置中设置 `CELERYD_POOL_RESTARTS` 以避免数据库连接池的重复连接问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kuokay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值