首頁  >  文章  >  後端開發  >  使用Celery Redis Django優化網站非同步任務處理流程

使用Celery Redis Django優化網站非同步任務處理流程

WBOY
WBOY原創
2023-09-27 08:38:01763瀏覽

使用Celery Redis Django优化网站异步任务处理流程

使用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 檔案中加入如下設定:

Redis 作為訊息代理程式

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 中編寫發送郵件的非同步任務。

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 上。

views.py

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執行測試與總結

啟動Django 項目,然後透過瀏覽器存取send_email_view 視圖對應的URL 位址,填寫相關訊息,點擊發送郵件按鈕。

可以觀察到郵件會在後台非同步發送,而介面則立即回應一條提示訊息,使用者無需等待郵件發送完成。這就是使用 Celery Redis Django 實現的非同步任務處理流程。


總結:
使用 Celery Redis Django 可以很方便地實現網站的非同步任務處理。透過將耗時的操作放入 Celery 非同步任務中,可以有效提升網站的效能和使用者體驗。在具體使用過程中,我們需要安裝配置 Celery 並定義任務模組,然後在 Django 中呼叫非同步任務函數即可實現非同步處理。不同的任務可以透過不同的 workers 實現並發處理,提升整個系統的並發處理能力。

具體程式碼範例:

settings.py

Redis 作為訊息代理程式

BROKER_URL = 'redis://localhost:6379/0'

在本機上儲存任務結果

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

定義任務模組

CELERY_IMPORTS = (

'your_app.tasks',

)

設定預設任務佇列名稱

CELERY_DEFAULT_QUEUE = 'default'

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)

views.py


#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')

以上是使用Celery Redis Django優化網站非同步任務處理流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn