Django框架(十六)--redis,celery異步任務

IO密集型–使用多線程

計算密集型–使用多進程

一、celery

在web開發中,要給用戶發送郵件,發送短信,都屬於耗時的操作,會導致給用戶響應的時間變長。這種情況的解決辦法,就是給用戶先返回一個響應,不要影響用戶的使用。將這些耗時的操作,放在後臺執行,例如新開一個進程,celery就是用來處理這個問題的。

celery組成部分

  • worker
    • 工人,執行任務的單元
  • broker
    • 消息中間件,即中間人
    • 用來在服務和worker中傳遞消息
    • redis
  • backend
    • 用來存儲消息以及celery執行結果

Django封裝了celery,叫做django-celery

(一)django+celery+redis

Redis

使用cmd切換進解壓路徑

在這裏插入圖片描述

啓動

打開另一個cmd窗口,可使用

在這裏插入圖片描述

關閉

在這裏插入圖片描述

初始狀態是下標爲0的數據庫,切換數據庫

Redis中有16個數據庫

在這裏插入圖片描述

字符串類型

在這裏插入圖片描述

(二)Django的celery異步任務

和之前的開發相比,django-celery只是將任務發佈出去,處理耗時操作。比如發送郵件,發送短信,爬蟲,使用異步任務去實現,使得主進程不會阻塞。web服務只負責發起任務和接收任務的結果,中間執行的過程交給異步任務處理。

安裝註冊

pip install django-celery
pip install django-redis
pip install redis==2.10.6

在這裏插入圖片描述

配置

在這裏插入圖片描述

創建子應用,新建文件

在這裏插入圖片描述
在這裏插入圖片描述

在主項目下創建celery.py

在這裏插入圖片描述

編寫celery.py

在這裏插入圖片描述

編寫tasks.py任務文件

from __future__ import absolute_import
from Qshop.celery import app

# 創建任務
@app.task    # 將普通的函數轉換爲celery任務
def test():
    print('--------I am test task--------')
    return 'I am test task'

進行數據遷移

啓動celery

python manage.py celery worker --loglevel=info

在這裏插入圖片描述

tasks.py

from __future__ import absolute_import
from Qshop.celery import app
import time

# 創建任務
@app.task    # 將普通的函數轉換爲celery任務
def test():
    time.sleep(2)
    print('--------I am test task--------')
    return 'I am test task'

@app.task
def myprint(name,age):
    time.sleep(5)
    print('%s:%s'%(name,age))
    return 'I am myprint'

views.py

from CeleryTask.tasks import *
def reqtest(request):
    # 執行celery任務
    # test.delay()    # 發佈任務
    name = request.GET.get('name')
    age = request.GET.get('age')
    myprint.delay(name,age)
    return HttpResponse('req test')

路由

在這裏插入圖片描述

(三)celery的定時任務

1.timedelta

配置

在這裏插入圖片描述

啓動定時任務

啓動之前,確保redis,worker啓動

python manage.py celerybeat --loglevel=info

在這裏插入圖片描述

2.crontab

crontab(hour='*/2')    # 每隔兩個小時執行一次
crontab(minute=0,hour='*/2')    # 每隔兩個小時的0分執行一次
crontab(minute = 0,hour="*/2,8-12")    # 每隔兩小時或者是8到12點執行 
crontab(minute = 0,hour=0,day_of_month="2-31/2")    # 偶數天執行 
crontab(minute = 0,hour=0,day_of_month="1" month_of_year="5")    # 每年的5月1號 執行一次

異步事務–實現發送短信驗證

tasks.py

在這裏插入圖片描述

視圖

在這裏插入圖片描述

路由

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章