定時任務常見場景
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