定时任务常见场景
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
# 定时任务的调度列表,用于注册定时任务
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)#注意:任务就是一个函数,所有如果有参数则需要传递
}
}
接下来,我们就可以重启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