python django與celery的整合

頂級飲水機管理員發表於2021-07-15

一、celery與django

關於celery介紹和使用可以檢視上篇Python中任務佇列-芹菜celery的使用

關於django的介紹和使用可檢視python django框架+vue.js前後端分離

我來看一下celery整合到django後的整個工作鏈:django將任務轉發給訊息佇列,celery讀取到任務後執行並將結果通過django ORM 儲存。

isizlxif84uhk8hnad98

在本文中兩個外掛:

  • 使用django-celery-results將celery處理結果進行ORM儲存
  • 使用django-celery-beat 對任務管理和週期排程

二、基本使用

1.建立一個django專案,不再贅述

建好後目錄看起來是這樣的

django_celery
├── celery_app
│   ├── __init__.py
│   ├── apps.py
│   ├── migrations/
│   ├── models.py
│   ├── admin.py
│   └── views.py
├── manage.py
├── django_celery
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── env/
│── db.sqlite3

安裝外掛

pip install django-celery-results
pip install django-celery-beat

在專案settings.py我們會安裝appcelery_appdjango_celery_resultsdjango_celery_beat並開啟我們的admin後臺用於檢視和管理我們的任務排程。

2.新增任務tasks.py

我們在celery_app中新增任務檔案tasks.py其中包含上篇文章中單args_add1任務,並通過shared_task進行裝飾。

from __future__ import absolute_import
from celery import shared_task
import time

@shared_task
def args_add1(x,y):
    print("start task no.1 now!")
    time.sleep(10)
    print("task no.1 end!")
    return x+y
3.配置celery應用

在django_celery目錄下新增celery.py用於建立我們的celery應用

import os
from celery import Celery
#載入配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings')
#建立celery app
app = Celery('django_celery')
app.config_from_object('django.conf:settings', namespace='CELERY')
#自動發現專案中的tasks
app.autodiscover_tasks()

在setting中新增celery相關配置,指定Broker和Backend。這裡我們延用上篇的rabbitmq作為Broker,後端配置為django-db

CELERY_BROKER_URL = 'amqp://rabbit_user:rabbit_pass@i-k9pwet2d/rabbit_vhost'

CELERY_RESULT_BACKEND = 'django-db'

我們的celery應用配置好了,然後我們要啟動它,在__init__.py中加入我們的app

from .celery import app as celery_app

__all__ = ['celery_app']
4.配置django

通過上面的配置我們有了celery應用,也有了任務,接下來我們配置一個URL請求來傳送我們的任務給celery。

對我們app下views.py編寫如下

from django.http import JsonResponse
from celery_app import tasks
from celery.result import AsyncResult

# Create your views here.

def celery(request,*args,**kwargs):
    res=tasks.args_add1.delay(123,456) #傳送任務給celery  
    result = AsyncResult(res.task_id)
    return JsonResponse({'status':result.status,'task_id':result.task_id})

配置路由

from django.contrib import admin
from django.urls import path
import celery_app.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('celery/',celery_app.views.celery)
]
5.檢視任務執行

通過上面配置我們基本款已經成了。我們啟動django和celery worker看看img

python manage.py migrate
python manage.py runserver

啟動celery worker

celery -A django_celery worker --loglevel=info --concurrency=10

訪問地址:http://127.0.0.1:8000/celery/ 傳送我們的任務,此時任務已處於等待狀態。

image-20210715175802246

在worker終端上可以檢視到任務正在被處理。

image-20210715172017292

我們在django後臺檢視task執行記錄和細節

image-20210714173114887

image-20210715173019008

三、週期性任務排程

在前面我們已經安裝了django-celery-beat

我們在後臺Periodic tasks中配置我們的週期性任務,也可以通過Crontab Schedule來配置計劃任務。

image-20210715173308734

我們配置一個每5小時執行一次的任務。

image-20210715173725961

啟動排程器,這樣我們的任務就會在後臺默默無聞的週期性工作啦。

celery -A django_celery beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler

以上是celery整合到django中的基礎使用。


文章有不足的地方歡迎指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。

相關文章