Python伺服器程式設計:使用django-celery進行任務佇列
隨著Web應用程式的日益普及和使用者數量的增加,現代Web應用程式需要透過處理複雜且時間敏感的任務來保持生產力和穩定性。從電子商務網站上的訂單處理和系統日誌檔案的處理到電腦視覺和自然語言處理的高級應用,這些任務需要獨立的進程來處理。
常規做法是使用 cron 或類似的作業調度器,但有下列問題:
因此,為了解決這些問題,我們需要一種任務佇列服務。
在Python生態系中,Celery是最常用的任務佇列。它是一種面向分散式系統設計的任務佇列,適用於高並發,高吞吐量的網路應用程式。
在本文中,我們將介紹如何使用Celery和Django開發任務佇列服務。我們將使用Django-Celery作為Celery的Django整合。
首先,我們需要將Celery和Django-Celery的依賴項安裝到專案中。您可以使用pip工具來安裝它們。
pip install celery django-celery
在我們開始使用Celery之前,我們需要設定Celery。為此,請建立一個名為celery.py的文件,該文件應該位於您的專案的根目錄中。該檔案的內容如下:
from __future__ import absolute_import, unicode_literals import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings') app = Celery('example') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django app configs. app.autodiscover_tasks()
注意:如果您希望使用在settings.py檔案中指定的配置來設定Celery,請將'example.settings'替換為實際的Django專案名稱。
現在,我們需要在settings.py檔案中設定Django,以便它支援Celery。
# Celery Configuration CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # app注册 INSTALLED_APPS = ( ... 'django_celery_results', 'django_celery_beat', ... )
在這裡,我們配置了兩個關鍵設定。 (1)CELERY_BROKER_URL – 這告訴Celery使用Redis作為其中間件服務。 (2)INSTALLED_APPS – 我們需要在我們的應用程式中註冊Django-Celery的兩個應用程式。
現在我們已經配置了Celery和Django,我們可以開始定義一些任務了。我們將建立一個範例任務來示範任務的結構和語法。在app/tasks.py檔案中,加入以下內容。
from django.core.mail import send_mail from celery import shared_task from datetime import datetime @shared_task def send_email_task(): subject = 'Celery Email Demo' message = 'This email is sent using celery!' from_email = 'demo@example.com' recipient_list = ['recipient@example.com'] send_mail(subject, message, from_email, recipient_list) print('Email Sent Successfully') return None @shared_task def print_time(): now = datetime.now() current_time = now.strftime("%H:%M:%S") print("Current Time =", current_time) return None
在這裡,我們定義了兩個任務。它們分別是send_email_task和print_time任務。注意這一點,我們將任務修飾為shared_task裝飾器。這使得我們的任務可以在任何地方訪問,使它們可以被多個進程調用。
現在,我們已經定義了任務,我們需要啟動worker進程並告訴它們執行哪些任務。
開啟一個終端機窗口,並輸入以下指令:
$ celery -A example worker --loglevel=info
注意,example代表Django專案的名稱。在這裡,我們使用--loglevel = info來控制worker的日誌等級。
Django-Celery支援在Django Admin介面中管理和排程任務。我們需要註冊Django-Celery的兩個應用程式。我們可以在admin.py檔案中加入以下程式碼。
from django.contrib import admin from django_celery_beat.admin import PeriodicTaskAdmin, IntervalScheduleAdmin from django_celery_results.models import TaskResult from django_celery_results.admin import TaskResultAdmin from core.tasks import send_email_task, print_time class Tasks(admin.ModelAdmin): actions = ['send_email_task', 'print_time'] def send_email_task(self, request, queryset): send_email_task.delay() send_email_task.short_description = "Send Email Task" def print_time(self, request, queryset): print_time.delay() print_time.short_description = "Print Current Time" admin.site.unregister(TaskResult) admin.site.register(TaskResult, TaskResultAdmin) admin.site.register(IntervalSchedule, IntervalScheduleAdmin) admin.site.register(PeriodicTask, PeriodicTaskAdmin) admin.site.register(Tasks)
在這裡,我們將我們的任務加入到admin介面中。我們可以點選「執行郵件任務」和「列印目前時間」按鈕來執行這些任務。
現在,我們已經成功地使用Django-Celery建立了一個任務佇列服務。我們可以將其用於不同的應用程序,並使用WebSocket和HTTP協定等通訊協定將其分發到多個伺服器中。
結論
本文介紹如何使用Celery和Django開發任務佇列服務。我們使用Django-Celery作為Celery的Django集成,並示範如何定義任務,配置Celery,啟動Worker,調度任務以及管理任務。任務佇列服務提供了處理複雜且耗時的任務的絕佳方式,並使網路應用程式的效能和可靠性更好。
以上是Python伺服器程式設計:使用django-celery進行任務佇列的詳細內容。更多資訊請關注PHP中文網其他相關文章!