Administra tareas programadas con Django y Celery


Publicado simultáneamente en el sitio personal: http://panzhixiang.cn/article/2023/3/16/68.html

1. Introducción a los antecedentes

Hemos estado usando cronjob de k8 para administrar tareas programadas anteriormente. Encapsule por separado el código relacionado con la tarea programada en un pod y luego use el método cronjob para activarlo.

Aunque este método es muy simple de operar y no depende de recursos de terceros (como Redis), también tiene una desventaja obvia.

El código de la tarea programada está separado del código de Django, y muchas funciones de Django no se pueden usar, solo se puede comunicar con el servidor de Django a través de la API encapsulada por DRF.
A veces, para una tarea programada, se deben encapsular muchas API y también se deben considerar problemas como la autenticación, lo cual es bastante problemático, por lo que planeo cambiar un método para administrar las tareas programadas en un nuevo proyecto.

Los ingenieros que usan Python y Django probablemente conozcan Celery, que es un buen marco para tareas asincrónicas. La última vez que lo usé fue en 2020, y descubrí que la forma de usar el apio ha cambiado en los últimos años. Busqué en Internet y no pude encontrar ningún buen material chino, así que escribí un blog relacionado por mi cuenta, con la esperanza de dale al futuro Una pequeña ayuda para aquellos que necesitan buscar información relevante.

Dos, configuración de apio

Antes de configurar Celery, primero debe instalarlo pip install celeryy luego comenzar a configurar.

Antes de comenzar a introducir oficialmente la configuración, necesitamos algunas suposiciones para que el siguiente texto pueda expresarse con mayor claridad.

Vamos a django-admin startproject projcrear un proyecto de Django. La versión de Django debe ser >=3.0. Después de una creación exitosa, obtendremos la siguiente estructura de directorios:

proj
├── manage.py
└── proj
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Aquellos que estén familiarizados con Django deberían estar muy familiarizados con el árbol de directorios anterior. El siguiente contenido está escrito en base a este árbol de directorios, por lo que debe recordar este árbol de directorios.

1. Definir la instancia de Celery

Para definir una instancia de Celery, se debe crear un archivo en el árbol de directorios anterior: proj/proj/celery.py.
El nombre del archivo es apio.py , que se encuentra en el mismo directorio que settings.py.

El contenido es el siguiente, he escrito información importante en el código en forma de comentarios, preste atención para verificar.

import os
from celery import Celery


# 这个配置可以避免在其他的tasks.py中初始化django配置,虽然不是必须的,但是强烈建议要有这个配置
os.environ.setdefault(
    'DJANGO_SETTINGS_MODULE', 'proj.settings'
)

# 这个就是从环境变量中获取redis的地址,我这里使用redis作为broker
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost:6379')
app = Celery(
    'proj',  # 第一个参数是为celery的实例起了一个名字,这里叫做proj
    backend='redis://' + REDIS_HOST + '/1',
    broker='redis://' + REDIS_HOST + '/0',
)

# 可以用这个方法批量配置celery,
# 这几个配置在一帮的场景中就足够使用了
# 另外,其实还有几种其他方法来配置celery,但是我觉得这个方法对于不是非常大的项目来说就足够了。
app.conf.update(
    task_serializer='json',
    accept_content=['json'],  # Ignore other content
    result_serializer='json',
    enable_utc=True,
)

# 这一行会从django的settings文件中获取一些celery的配置
# namespace等于CELERY的意思是settings中以 “CELERY_” 开头的配置都会被识别为celery的配置
app.config_from_object('django.conf:settings', namespace='CELERY')

# 会自动发现所有Django app中的任务
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {
      
      self.request!r}')

Además de la configuración anterior, hay otros dos lugares que deben configurarse.
El primero es agregar lo siguiente a proj/proj/__init__.py :

from .celery import app as celery_app


__all__ = ('celery_app',)

Su función es cargar automáticamente el apio al iniciar Django.

Otra es que necesita agregar la configuración de apio en la configuración de django, que es app.config_from_object('django.conf:settings', namespace='CELERY')la parte mencionada en el código anterior.

CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60  # 单个任务的最大运行时间,单位是秒

2. Documentar los resultados de la tarea

Al usar apio para la programación de tareas, es mejor registrar los resultados de cada tarea para referencia futura, especialmente cuando la tarea no se ejecuta como se esperaba, esto es aún más importante.

El sitio web oficial recomienda usar django-celery-results para registrar los resultados de las tareas.

  1. Instalar
    pip install django-celery-results
  2. El registro de
    django-celery-results es una aplicación de django separada, por lo que debe registrarla en settings.py
    INSTALLED_APPS = (
        ...,
        'django_celery_results',
    )
    
    Después del registro, debe migrar la base de datos,
    python manage.py migrate django_celery_results
  3. Configurar
    django-celery-results es solo un paquete para ayudar a almacenar automáticamente los resultados de las tareas. Los datos finales deben aterrizarse en un lugar. Hay muchos lugares que se pueden usar para almacenar los resultados de las tareas, como bases de datos, sistemas de archivos locales, redis , etc. Aquí uso bases de datos. También se recomienda usar una base de datos.
    Agregue una configuración a setting.py de django:
    CELERY_RESULT_BACKEND = 'django-db'  # 使用数据库做后端
    CELERY_CACHE_BACKEND = 'django-cache'  # 老实说,不知道这个缓存配置到底有什么作用,但是官网推荐使用这个配置,我也就留着了
    CELERY_CACHE_BACKEND = 'default'
    
  4. Tenga en cuenta
    que este comando debe ejecutarse en el directorio proj de primer nivel; de lo contrario, se informará un error que indica que no se puede encontrar el archivo de configuración.
    celery -A backend worker --loglevel=INFO
    

3. Configuración de tareas de temporización

Cómo configurar el apio se introdujo anteriormente, ahora que el apio está disponible, ¿cómo administrar las tareas programadas? En este momento se usará django-celery-beat, y su uso es relativamente simple.

1. Configurar django-celery-beat

  1. Instalar
    pip install django-celery-beat
  2. Registro Regístrate
    en settings.py de django
    INSTALLED_APPS = (
        ...,
        'django_celery_beat',
    )
    
    Del mismo modo, para migrar la base de datos después del registro,
    python manage.py migrate django-celery-beat
  3. Tenga en cuenta
    que este comando debe ejecutarse en el directorio proj de primer nivel; de lo contrario, se informará un error que indica que no se puede encontrar el archivo de configuración.
    celery -A proj beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    

Lo que quiero explicar por separado es que cuando muchas personas usan django_celery_beat para la gestión de tareas de temporización, les gusta encapsular las tareas de temporización en forma de cronjob en el código, pero prefiero configurarlas en la base de datos a través de la página de administración de Django.

Debido a que está encapsulado en el código, si desea modificar la tarea programada en el futuro, debe volver a escribir el código y desplegarlo en el entorno, que no es muy amigable, y para el personal no técnico, la posibilidad de configurar la tarea programada por ti mismo es casi cero.

2. Establecer tareas cronometradas específicas a través de Django Admin

El contenido de esta parte es relativamente simple. Inicie Django, inicie sesión en la página de administración y haga clic en Crear en la página. No es difícil, pero si quiere escribirlo, necesita conectar muchas imágenes, así que no Realmente no quiero escribirlo.

4. Referencia

  1. Primeros pasos con Django
  2. Configuración de back-end del resultado de la tarea

Supongo que te gusta

Origin blog.csdn.net/u013117791/article/details/129584654
Recomendado
Clasificación