ホームページ >バックエンド開発 >Python チュートリアル >Python サーバー プログラミング: django-celery を使用したタスク キュー

Python サーバー プログラミング: django-celery を使用したタスク キュー

王林
王林オリジナル
2023-06-18 17:09:111493ブラウズ

Python サーバー プログラミング: django-celery を使用したタスク キュー

Web アプリケーションの人気が高まり、ユーザー数が増加する中、最新の Web アプリケーションは、複雑で時間に敏感なタスクを処理して生産性を維持する必要があります。そして安定性。電子商取引 Web サイトでの注文処理やシステム ログ ファイルの処理から、コンピューター ビジョンや自然言語処理の高度なアプリケーションに至るまで、これらのタスクは独立したプロセスで処理する必要があります。

従来のアプローチは cron などのジョブ スケジューラを使用することでしたが、次のような問題がありました。

  • タスクを動的に管理し、割り当てることが困難です。
  • 失敗したタスクを再試行するのが難しい。
  • タスクを複数のサーバーに簡単に分散できません。
  • ジョブとタスクのステータスを追跡および監視することはできません。

したがって、これらの問題を解決するには、タスク キュー サービスが必要です。

Python エコシステムでは、Celery が最も一般的に使用されるタスク キューです。これは、分散システム用に設計されたタスク キューであり、同時実行性、スループットの高い Web アプリケーションに適しています。

この記事では、CeleryとDjangoを使ってタスクキューサービスを開発する方法を紹介します。 Celery の Django 統合として Django-Celery を使用します。

  1. 関連する依存関係をインストールする

まず、Celery と Django-Celery の依存関係をプロジェクトにインストールする必要があります。 pip ツールを使用してインストールできます。

pip install celery django-celery

  1. 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 プロジェクト名に置き換えます。

  1. Django の構成

次に、Django が Celery をサポートするように settings.py ファイルで構成する必要があります。

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

ここでは、2 つの主要な設定を構成します。 (1) CELERY_BROKER_URL – これは Celery に Redis をミドルウェア サービスとして使用するよう指示します。 (2) INSTALLED_APPS – アプリケーションに Django-Celery の 2 つのアプリケーションを登録する必要があります。

  1. タスクの作成

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

ここでは、2 つのタスクを定義します。それらはそれぞれ send_email_task タスクと print_time タスクです。これに注意してください。タスクをshared_taskデコレータで装飾します。これにより、どこからでもタスクにアクセスできるようになり、複数のプロセスからタスクを呼び出すことができるようになります。

  1. ワーカー プロセスの開始

タスクを定義したので、次はワーカー プロセスを開始し、実行するタスクを指示する必要があります。

ターミナル ウィンドウを開いて次のコマンドを入力します:

$ celery -A example worker --loglevel=info

この例は Django プロジェクトの名前を表していることに注意してください。ここでは、 --loglevel=info を使用してワーカーのログ レベルを制御します。

  1. Django 管理インターフェイスを使用したタスクのスケジュール

Django-Celery は、Django 管理インターフェイスでのタスクの管理とスケジュールをサポートします。 Django-Celery に 2 つのアプリケーションを登録する必要があります。次のコードを 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)

ここでは、管理インターフェイスにタスクを追加します。これらのタスクは、[メール タスクの実行] ボタンと [現在の時刻の印刷] ボタンをクリックして実行できます。

これで、Django-Celery を使用してタスク キュー サービスを確立することができました。これをさまざまなアプリケーションに使用したり、WebSocket や HTTP プロトコルなどの通信プロトコルを使用して複数のサーバーに配布したりできます。

結論

この記事では、Celery と Django を使用してタスク キュー サービスを開発する方法を紹介します。 Celery の Django 統合として Django-Celery を使用し、タスクの定義、Celery の構成、ワーカーの開始、タスクのスケジュール設定、タスクの管理の方法を示します。タスク キュー サービスは、複雑で時間のかかるタスクを処理し、Web アプリケーションのパフォーマンスと信頼性を向上させる優れた方法を提供します。

以上がPython サーバー プログラミング: django-celery を使用したタスク キューの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。