將任務分配給其餘的進程去運行,django的主進程只負責發起任務,而執行任務的不在使用django的主進程。Python有一個很棒的異步任務框架,叫作celery。python
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
一、在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.建立使用celery的appapp
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.py在celeryTask 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
訪問路由查看效果。
在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,定時任務