Django 異步任務、定時任務Celery

將任務分配給其餘的進程去運行,django的主進程只負責發起任務,而執行任務的不在使用django的主進程。Python有一個很棒的異步任務框架,叫作celerypython

Django爲了讓開發者開發更加方便,集成了celery,造成了django-celery插件web

1.安裝django-celeryredis

 

#Redis模塊的兼容不穩定,必須安裝2.10.6
pip install django-celery 
pip install django-redis 
pip install redis==2.10.6

 

2.安裝redis ,解壓到指定目錄數據庫

Redis-x64-3.2.100.zip 提取碼: jmbf django

 

 

 

 

 

 

#啓動redis
redis-server.exe redis.windows.conf
#關閉redis
redis-cli.exe
shutdown

django-celery只是將任務發佈出去,讓長時間的任務:爬取一個網站,發送一個驗證碼這樣的工做,再也不阻塞主線程,web服務器只負責發起任務和接受任務的結果,中間執行的部分交給其餘線程、進程、服務器去作。json

Celery異步任務

 

一、settings當中配置django-celerywindows

下面也是settings.py 配置服務器

# celery 配置
import djcelery


djcelery.setup_loader()# 模塊加載
BROKER_URL = 'redis://127.0.0.1:6379/1' # 任務容器地址,redis數據庫地址
CELERY_IMPORTS = ('CeleryTask.tasks') # 具體任務文件
CELERY_TIMEZONE = 'Asia/Shanghai' # celery 時區
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # celey處理器,固定

 

 

 

 2.建立使用celeryappapp

 

python manage.py startapp CeleryTask

 

在項目的主目錄下,編寫celery的控制文件,(控制文件的名字最好是celery)框架

 

 

 celery.py

import os
from celery import Celery
from django.conf import settings

# 設置celery的環境變量和django-celery的工做目錄
os.environ.setdefault("DJANGO_SETTINGS_MODULE","CeleryTask.settings")
# 實例化celery應用,傳入服務器名稱
app = Celery("art_project")
# 加載celery配置
app.config_from_object("django.conf:settings")

# 若是在項目中,建立了task.py,那麼celery就會沿着app去查找task.py來生成任務
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

3.新建tasks.pyceleryTask app

 

 

 4.編寫tasks.py文件

from __future__ import absolute_import
from Qshop.celery import app

@app.task
def add(x,y):
    return x+y

5.而後爲了djcelery進行數據庫同步

python manage.py check
python manage.py makemigrations
python manage.py migrate

6.編寫視圖觸發異步任務

ursl.py

urlpatterns = [

    path('mtv/', middle_test_view),
]

views.py 

from CeleryTask.tasks import add


def get_task(request):
    num1 = request.GET.get("num1",1)
    num2 = request.GET.get("num2",2)
    add.delay(int(num1),int(num2))

    return JsonResponse({"data":"success"})

7.啓動celery worker

--loglevel=info 指定日誌級別

python manage.py celery worker --loglevel=info

訪問路由查看效果。

Celery 定時任務

在settings .py配置

from celery.schedules import crontab
from celery.schedules import timedelta

CELERYBEAT_SCHEDULE = {
    u"測試任務":{
        "task":"CeleryTask.tasks.sendDing",
        "schedule":timedelta(seconds=10)
    }
}

tasks.py

@app.task
def sendDing(content="定時任務執行",to="15037609692"):
    headers = {
        "Content-Type": "application/json",
        "Charset": "utf-8"
    }
    requests_data = {
        "msgtype": "text",
        "text": {
            "content": content
        },
        "at": {
            "atMobiles": [
            ],
            "isAtAll": True
        }
    }
    if to:
        requests_data["at"]["atMobiles"].append(to)
        requests_data["at"]["isAtAll"] = False
    else:
        requests_data["at"]["atMobiles"].clear()
        requests_data["at"]["isAtAll"] = True
    sendData = json.dumps(requests_data)
    response = requests.post(url=DING_URL, headers=headers, data=sendData)
    content = response.json()
    return content

啓動worker

python manage.py celery worker --loglevel=info

啓動定時任務

python manage.py celerybeat --loglevel=info

注意:須要啓動的有,django項目,redis數據庫,worker,定時任務

相關文章
相關標籤/搜索