Maison >développement back-end >Tutoriel Python >Programmation serveur Python : file d'attente de tâches utilisant Django-celery

Programmation serveur Python : file d'attente de tâches utilisant Django-celery

王林
王林original
2023-06-18 17:09:111491parcourir

Programmation Python Server : Task Queuing avec Django-celery

Avec la popularité croissante des applications Web et l'augmentation du nombre d'utilisateurs, les applications Web modernes doivent maintenir la productivité et la stabilité en gérant des tâches complexes et urgentes. Du traitement des commandes sur les sites Web de commerce électronique et du traitement des fichiers journaux du système aux applications avancées de vision par ordinateur et de traitement du langage naturel, ces tâches nécessitent des processus indépendants.

L'approche conventionnelle consiste à utiliser cron ou un planificateur de tâches similaire, mais il existe les problèmes suivants :

  • Il est difficile de gérer et d'attribuer dynamiquement les tâches.
  • Difficile de réessayer les tâches ayant échoué.
  • Impossible de distribuer facilement les tâches sur plusieurs serveurs.
  • Aucun moyen de suivre et de surveiller l'état des travaux et des tâches.

Donc, afin de résoudre ces problèmes, nous avons besoin d'un service de file d'attente des tâches.

Dans l'écosystème Python, Celery est la file d'attente de tâches la plus couramment utilisée. Il s'agit d'une file d'attente de tâches conçue pour les systèmes distribués et adaptée aux applications Web à haute concurrence et à haut débit.

Dans cet article, nous présenterons comment développer un service de file d'attente de tâches à l'aide de Celery et Django. Nous utiliserons Django-Celery comme intégration Django pour Celery.

  1. Installer les dépendances associées

Tout d'abord, nous devons installer les dépendances de Celery et Django-Celery dans le projet. Vous pouvez utiliser l'outil pip pour les installer.

pip install céleri django-celery

  1. Configurer Celery

Avant de commencer à utiliser Celery, nous devons configurer Celery. Pour ce faire, créez un fichier appelé celery.py, qui doit se trouver dans le répertoire racine de votre projet. Le contenu du fichier est le suivant :

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()

Remarque : Si vous souhaitez configurer Celery en utilisant la configuration spécifiée dans le fichier settings.py, veuillez remplacer 'example.settings' par le nom réel de votre projet Django.

  1. Configuration de Django

Maintenant, nous devons configurer Django dans le fichier settings.py pour qu'il prenne en charge 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',
    ...
)

Ici, nous configurons deux paramètres clés. (1) CELERY_BROKER_URL – Cela indique à Celery d'utiliser Redis comme service middleware. (2) INSTALLED_APPS – Nous devons enregistrer deux applications de Django-Celery dans notre application.

  1. Créer une tâche

Maintenant que Celery et Django sont configurés, nous pouvons commencer à définir certaines tâches. Nous allons créer un exemple de tâche pour démontrer la structure et la syntaxe de la tâche. Dans le fichier app/tasks.py, ajoutez le contenu suivant.

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

Ici, nous définissons deux tâches. Il s'agit respectivement des tâches send_email_task et print_time. Faites attention à cela, nous décorons la tâche avec le décorateur shared_task. Cela rend nos tâches accessibles de n'importe où, leur permettant d'être appelées par plusieurs processus.

  1. Démarrer les processus de travail

Maintenant que nous avons défini les tâches, nous devons démarrer les processus de travail et leur indiquer les tâches à effectuer.

Ouvrez une fenêtre de terminal et entrez la commande suivante :

$ celery -A example worker --loglevel=info

Notez que cet exemple représente le nom du projet Django. Ici, nous utilisons --loglevel=info pour contrôler le niveau de journalisation du travailleur.

  1. Planification des tâches via l'interface d'administration de Django

Django-Celery prend en charge la gestion et la planification des tâches dans l'interface d'administration de Django. Nous devons enregistrer deux applications auprès de Django-Celery. Nous pouvons ajouter le code suivant dans le fichier 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)

Ici, nous ajoutons nos tâches à l'interface d'administration. Nous pouvons effectuer ces tâches en cliquant sur les boutons « Effectuer une tâche de courrier » et « Imprimer l'heure actuelle ».

Maintenant, nous avons mis en place avec succès un service de file d'attente de tâches en utilisant Django-Celery. Nous pouvons l'utiliser pour différentes applications et le distribuer sur plusieurs serveurs en utilisant des protocoles de communication tels que les protocoles WebSocket et HTTP.

Conclusion

Cet article présente comment développer un service de file d'attente de tâches à l'aide de Celery et Django. Nous utilisons Django-Celery comme intégration Django pour Celery et montrons comment définir des tâches, configurer Celery, démarrer des travailleurs, planifier des tâches et gérer des tâches. Les services de file d'attente de tâches constituent un excellent moyen de gérer des tâches complexes et chronophages et permettent d'améliorer les performances et la fiabilité des applications Web.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn