celery定时任务


定时任务常见场景

1.订单超时
2.生日邮件[例如,每天凌晨检查当天有没有用户生日,有则发送一份祝福邮件]
3.财务统计[例如,每个月的1号,把当月的订单进行统计,生成一个财务记录,保存到数据库中]
4.页面缓存[列如,把首页设置为每隔5分钟生成一次缓存]

使用celery的定时任务来完成订单超时功能

在实现定时任务之前,我们需要先简单使用以下
我们需要新增一个任务目录,例如order

celey_tasks/
    ├── sms/
    │   ├── __init__.py
    │   └── tasks.py
    ├── config.py
    ├── __init__.py
    ├── main.py
    ├── order/
    │   ├── __init__.py
    │   └── tasks.py
    └── sms

在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.sms','celery_tasks.order'])
# 4.在终端下面运行celery命令启动celery
# celery -A 主程序 worker --loglevel=info
# celery -A celery_tasks.main worker --loglevel=info

接下来,在order任务目录下,创建固定名字的任务文件taks.py,代码

from order.models import Order
from mycelery.main import app
from datetime import datetime, timedelta
from luffyapi.settings import contants

@app.task(name='check_oo') #起别名,如果起了别名,那么config中调度任务写别名就行
def check_order():
    """订单超时取消任务"""
    # 超时条件,当前时间 > 订单生成时间+超时时间 = 超时了
    # 当前时间 - 超时时间段 > 订单生成时间 = 超时了
    now_time = datetime.now() #当前时间
    out_time = contants.ORDER_OUTTIME # 配置文件中设置的超时时间
    # 超时时间点
    order_out_time = now_time - timedelta(seconds=out_time)

    order_list = Order.objects.filter(order_status=0, created_time__lt=order_out_time)
    for order in order_list:
        order.order_status = 3
        order.save()

接下来,我们需要把这个任务设置定时任务,所以需要借助celery本身提供的Crontab模块
在配置文件config.py中,对定时任务进行注册

# 任务队列的链接地址
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
# 和django框架同步时区
from django.conf import settings
app.conf.timezone = settings.TIME_ZONE
# 定时任务的调度列表,用于注册定时任务
app.conf.beat_schedule = {
      'check_order_outtime':{ #任务名称随便起
            # 本地调度的任务
            'task': 'check_order',# 这里的任务名称必须先到main.py中注册,如果写了别名,直接写别名就可以了,没有写别名,需要用路径写法order.tasks.check_order
            # 定时任务的调度周期
            #'schedule': crontab(minute=0, hour=0),# 每周凌晨00:00
            'schedule': crontab(), #每分钟,没写秒数,那么就是每分钟的0秒开始
            # 'args': (16, 16)#注意:任务就是一个函数,所有如果有参数则需要传递
            # 'kwargs' 有名参数
      }
}

接下来,我们就可以重启celery并启用celery的定时任务调度器,现在终端下,运行celery的定时任务程序,以下命令:

celery -A mycelery.main beat # mycelery.main是celery的主应用文件

然后再创建一个终端,运行以下命令,上面的命令必须先指定:

celery -A mycelery.main worker --loglevel=info

注意,使用的时候如果有时区必须先配置好系统时区

要完成订单的任务功能,如果需要调用django框架的模型操作,那么必须针对django框架进行配置加载和初始化。main.py文件

import os
from celery import Celery
# 1.创建实例对象
app = Celery('luffy')
# 2.把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
# 3.在当前celery中启动django框架,对django框架进行进行初始化
import django
django.setup()
# 4.加载配置
app.config_from_object('celery_tasks.config')
# 5.注册任务[自动搜索并加载任务]
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(['任务1','任务2'])
app.autodiscover_tasks(['celery_tasks.sms','celery_tasks.order'])
# 6.在终端下面运行celery命令启动celery
# celery -A 主程序 worker --loglevel=info
# celery -A celery_tasks.main worker --loglevel=info

参考文档

celery定时任务,可适用于任何框架
django-crontab,只适用于django框架


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM