django 中使用celery 設置定時任務


1.創建django項目delery_demo, 創建應用demo:

  

django-admin startproject delery_demo  創建項目
python manage.py startapp demo  創建app

 

2.項目的結構

3.在celery_demo模塊中創建celery.py模塊, 文件目錄為:

 

4.celery.py模塊內容為:

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

# 為celery設置環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_demo.settings')

# 創建應用
app = Celery("demo")
# 配置應用
app.conf.update(
    # 配置broker, 這里我們用redis作為broker
    BROKER_URL='redis://:332572@127.0.0.1:6379/1',
)
# 設置app自動加載任務
# 從已經安裝的app中查找任務
app.autodiscover_tasks(settings.INSTALLED_APPS)

5.在應用demo引用創建tasks.py模塊, 文件目錄為:

 

6.我們在文件內創建一個任務函數my_task:

from celery_demo.celery import app
import time

# 加上app對象的task裝飾器
# 此函數為任務函數
@app.task
def my_task():
    print("任務開始執行....")
    time.sleep(5)
    print("任務執行結束....")

7.在views.py模塊中創建視圖index:

from django.shortcuts import render
from django.http import HttpResponse
from .tasks import my_task


def index(request):
# 將my_task任務加入到celery隊列中
# 如果my_task函數有參數,可通過delay()傳遞
# 例如 my_task(a, b), my_task.delay(10, 20)
    my_task.delay()

    return HttpResponse("<h1>服務器返回響應內容!</h1>")

 

8.在celey_demo/settings.py配置視圖路由:

from django.conf.urls import url
from django.contrib import admin
from demo.views import index

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', index),
]

 

9.創建worker等待處理celery隊列中任務, 在終端執行命令:

celery -A celery_demo worker -l info

結果

10.啟動django測試服務器:

python manage.py runserver

 

11.此處需要用到額外包django_celery_results, 先安裝包:

pip install django-celery-results

12.在celery_demo/settings.py中安裝此應用:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demo',
    'django_celery_results',  # 注意此處應用名為下划線
]

13.回到celery_demo/celery.py模塊中,增加配置信息如下:

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

# 為celery設置環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_demo.settings')

# 創建應用
app = Celery("demo")
# 配置應用
app.conf.update(
    # 配置broker, 這里我們用redis作為broker
    BROKER_URL='redis://:332572@127.0.0.1:6379/1',
    # 使用項目數據庫存儲任務執行結果
    CELERY_RESULT_BACKEND='django-db',
)
# 設置app自動加載任務
# 從已經安裝的app中查找任務
app.autodiscover_tasks(settings.INSTALLED_APPS)

14.創建django_celery_results應用所需數據庫表, 執行遷移文件:

python manage.py migrate django_celery_results

15.如果我們想某日某時執行某個任務,或者每隔一段時間執行某個任務,也可以使用celery來完成.   使用定時任務,需要安裝額外包:

pip install django_celery_beat

16.首先在settings.py中安裝此應用:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demo',
    'django_celery_results',
    'django_celery_beat',  # 安裝應用
]

17.在celery_demo/celery.py模塊中增加定時任務配置:

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

# 為celery設置環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_demo.settings')

# 創建應用
app = Celery("demo")
# 配置應用
app.conf.update(
    # 配置broker, 這里我們用redis作為broker
    BROKER_URL='redis://:332572@127.0.0.1:6379/1',
    # 使用項目數據庫存儲任務執行結果
    CELERY_RESULT_BACKEND='django-db',
    # 配置定時器模塊,定時器信息存儲在數據庫中
    CELERYBEAT_SCHEDULER='django_celery_beat.schedulers.DatabaseScheduler',

)
# 設置app自動加載任務
# 從已經安裝的app中查找任務
app.autodiscover_tasks(settings.INSTALLED_APPS)

18.由於定時器信息存儲在數據庫中,我們需要先生成對應表, 對diango_celery_beat執行遷移操作,創建對應表:

python manage.py migrate django_celery_beat

19.我們可登錄網站后台Admin去創建對應任務, 首先我們先在tasks.py模塊中增加新的任務,用於定時去執行(5秒執行一次)

from celery_demo.celery import app
import time

# 用於定時執行的任務
@app.task
def interval_task():
    print("我每隔5秒鍾時間執行一次....")

20.首先創建后台管理員帳號:

python manage.py createsuperuser

21.登錄管理后台Admin:

 

22.其中Crontabs用於定時某個具體時間執行某個任務的時間,Intervals用於每隔多久執行任務的事件,具體任務的執行在Periodic tasks表中創建。

  我們要創建每隔5秒執行某個任務,所以在Intervals表名后面點擊Add按鈕:

23.然后在Periodic tasks表名后面,點擊Add按鈕,添加任務:

24.啟動定時任務:

celery -A celery_demo worker -l info --beat

人生忽如寄,山水有相逢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM