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