Celery、Redis和Django搭配使用,提高非同步任務處理效率
引言:在開發Web應用過程中,常常會遇到需要處理一些耗時的任務。如果這些任務直接在請求的處理流程中執行,會導致使用者等待時間過長,對使用者體驗極為不友善。為了解決這個問題,我們可以使用Celery、Redis和Django配合使用,將耗時的任務非同步處理,提升系統的效能和使用者體驗。
Celery介紹和安裝
Celery是一個任務佇列,它基於分散式訊息傳遞進行工作,同時也支援任務調度。安裝Celery可以透過pip指令來完成:
pip install celery
Django設定
首先需要在Django專案的settings.py檔案中新增Celery的設定項,如下所示:
# settings.py # Celery配置 CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json'
上述設定中,CELERY_BROKER_URL
和CELERY_RESULT_BACKEND
指定了Redis的位址和端口,用來作為任務佇列和結果儲存的後端。
接下來,在專案的urls.py檔案中新增Celery的配置,如下所示:
# urls.py from django.urls import path from .views import AsyncTaskView urlpatterns = [ path('async-task/', AsyncTaskView.as_view(), name='async_task'), ]
在Django的app中建立tasks.py文件,並在其中定義非同步任務的函數。下面是一個範例程式碼:
# app/tasks.py from celery import shared_task import time @shared_task def process_task(): # 模拟任务处理过程(等待5秒) time.sleep(5) return 'Task completed'在上述程式碼中,
@shared_task裝飾器用於將函數轉換為Celery的任務函數。
在Django的views.py檔案中定義一個視圖類,用於接收請求並呼叫非同步任務函數。下面是一個範例程式碼:
# app/views.py from django.views import View from .tasks import process_task from django.http import HttpResponse class AsyncTaskView(View): def get(self, request): # 调用异步任务 task = process_task.delay() return HttpResponse('Task started')
使用下列指令來啟動Celery的工作進程:
celery -A your_project_name worker --loglevel=info注意將
your_project_name替換為你的Django專案名稱。
,如果一切正常,你將會看到回傳結果為' Task started'。此時任務已經在背景非同步處理,並且不會阻塞使用者的請求處理。
以上是Celery、Redis和Django搭配使用,提高非同步任務處理效率的詳細內容。更多資訊請關注PHP中文網其他相關文章!