使用Celery Redis Django 優化網站非同步任務處理流程
前言:
在開發網站時,經常遇到一些耗時的操作,例如發送郵件、產生報表、爬取資料等。如果這些操作是同步的,會導致使用者在等待操作完成時出現卡頓現象,使用戶體驗變差。為了解決這個問題,可以使用非同步任務來處理耗時操作,而 Celery 是目前比較流行的 Python 非同步任務處理框架。
Celery 是一個分散式任務佇列框架,可以將任務放入佇列中,由 Celery 工作節點(Worker)非同步執行,從而實現任務的非同步執行。在 Celery 的使用中,Redis 是一個常用的訊息代理程式(Broker),用來傳遞 Celery 的任務。
為了更好地展示 Celery Redis Django 的使用,本文將以一個發送郵件的功能為例進行說明。以下將分為以下幾個部分進行講解:
一、環境準備
二、安裝Celery 與Redis
三、設定Celery
四、在Django 中實現非同步任務
五、啟動Celery Worker
六、編寫測試模組
七、運行測試與總結
#一、環境準備
在開始開發前,需要確保已經安裝了Python、Django和Redis。如果沒有安裝可以透過 pip 進行安裝。
二、安裝Celery 與Redis
$ pip install celery
$ pip install redis
三、設定Celery
在Django 專案的settings.py 檔案中加入如下設定:
BROKER_URL = 'redis://localhost:6379/0'
#CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_IMPORTS = (
'your_app.tasks',
)
CELERY_DEFAULT_QUEUE = 'default'
四、在Django 中實作非同步任務
在Django 專案的某些app 中建立一個tasks.py 文件,用於儲存非同步任務的函數。例如,我們建立一個 emails app,然後在 emails/tasks.py 中編寫發送郵件的非同步任務。
from celery import task
from django.core.mail import send_mail
@task()
def send_email_task(subject, message, from_email, recipient_list):
send_mail(subject, message, from_email, recipient_list)
要注意的是,這裡的task 裝飾器是Celery 提供的,用於將函數註冊為一個Celery 任務。
五、啟動 Celery Worker
開啟終端,切換到 Django 專案根目錄下,執行以下指令來啟動 Celery Worker。
$ celery -A project_name worker -l info
其中,project_name 是 Django 專案的名稱。
六、寫測試模組
在 Django 專案某個 app 的 views.py 中寫一個傳送郵件的視圖函數,並將該視圖函數綁定到某個 URL 上。
from django.shortcuts import render
from .tasks import send_email_task
#def send_email_view(request):
if request.method == 'POST': subject = request.POST.get('subject') message = request.POST.get('message') from_email = request.POST.get('from_email') recipient_list = [request.POST.get('recipient_email')] # 调用异步任务 send_email_task.delay(subject, message, from_email, recipient_list) return render(request, 'success.html') return render(request, 'send_email.html')
#def執行測試與總結
總結:
使用 Celery Redis Django 可以很方便地實現網站的非同步任務處理。透過將耗時的操作放入 Celery 非同步任務中,可以有效提升網站的效能和使用者體驗。在具體使用過程中,我們需要安裝配置 Celery 並定義任務模組,然後在 Django 中呼叫非同步任務函數即可實現非同步處理。不同的任務可以透過不同的 workers 實現並發處理,提升整個系統的並發處理能力。
'your_app.tasks',)設定預設任務佇列名稱CELERY_DEFAULT_QUEUE = 'default'tasks.py
from celery import task
@task()
send_mail(subject, message, from_email, recipient_list)
#from django.shortcuts import render
if request.method == 'POST': subject = request.POST.get('subject') message = request.POST.get('message') from_email = request.POST.get('from_email') recipient_list = [request.POST.get('recipient_email')] # 调用异步任务 send_email_task.delay(subject, message, from_email, recipient_list) return render(request, 'success.html') return render(request, 'send_email.html')
以上是使用Celery Redis Django優化網站非同步任務處理流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!