Versión: | 2.7.0 |
---|---|
Web: | http://django-celery-beat.readthedocs.io/ |
Descargar: | http://pypi.python.org/pypi/django-celery-beat |
Fuente: | http://github.com/celery/django-celery-beat |
Palabras clave: | django, apio, golpear, tarea periódica, cron, programación |
Esta extensión le permite almacenar el programa de tareas periódicas en la base de datos.
Las tareas periódicas se pueden administrar desde la interfaz de administración de Django, donde puede crear, editar y eliminar tareas periódicas y con qué frecuencia deben ejecutarse.
Las instrucciones de uso e instalación para esta extensión están disponibles en la documentación de Celery.
Advertencia
Si cambia la configuración de Django TIME_ZONE
su programación de tareas periódicas seguirá basándose en la zona horaria anterior.
Para solucionarlo, tendría que restablecer el "último tiempo de ejecución" para cada tarea periódica:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Nota
Esto restablecerá el estado como si las tareas periódicas nunca se hubieran ejecutado antes.
django_celery_beat.models.PeriodicTask
Este modelo define una única tarea periódica a ejecutar.
Debe estar asociado con un cronograma, que define con qué frecuencia debe ejecutarse la tarea.
django_celery_beat.models.IntervalSchedule
Un programa que se ejecuta en un intervalo específico (por ejemplo, cada 5 segundos).
django_celery_beat.models.CrontabSchedule
Un cronograma con campos como entradas en cron: minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Este modelo solo se utiliza como índice para realizar un seguimiento de cuándo ha cambiado el horario.
Cada vez que actualiza una PeriodicTask
también se incrementa un contador en esta tabla, lo que le indica al servicio celery beat
que recargue la programación desde la base de datos.
Si actualiza tareas periódicas de forma masiva, deberá actualizar el contador manualmente:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Para crear una tarea periódica que se ejecute en un intervalo, primero debe crear el objeto de intervalo:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
Estos son todos los campos que necesita: un tipo de período y la frecuencia.
Puedes elegir entre un conjunto específico de períodos:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Nota
Si tiene varias tareas periódicas que se ejecutan cada 10 segundos, todas deberían apuntar al mismo objeto de programación.
También hay una "tupla de opciones" disponible en caso de que necesite presentarla al usuario:
>> > IntervalSchedule . PERIOD_CHOICES
Ahora que hemos definido el objeto de programación, podemos crear la entrada de tarea periódica:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
Tenga en cuenta que este es un ejemplo muy básico, también puede especificar los argumentos y los argumentos de palabras clave utilizados para ejecutar la tarea, la queue
a la que enviarla [*] y establecer un tiempo de caducidad.
A continuación se muestra un ejemplo que especifica los argumentos; tenga en cuenta cómo se requiere la serialización JSON:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | También puede utilizar el enrutamiento AMQP de bajo nivel utilizando los campos exchange y routing_key . |
Una programación crontab tiene los campos: minute
, hour
, day_of_week
, day_of_month
y month_of_year
, por lo que si desea el equivalente a una entrada de crontab 30 * * * *
(ejecutada 30 minutos después de cada hora), especifique:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
La programación de crontab está vinculada a una zona horaria específica mediante el parámetro de entrada 'zona horaria'.
Luego, para crear una tarea periódica usando esta programación, utilice el mismo enfoque que la tarea periódica basada en intervalos anterior en este documento, pero en lugar de interval=schedule
, especifique crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Puede utilizar la bandera enabled
para deshabilitar temporalmente una tarea periódica:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
Las tareas periódicas todavía necesitan "trabajadores" para ejecutarlas. Así que asegúrese de que esté instalado el paquete Celery predeterminado. (Si no está instalado, siga las instrucciones de instalación aquí: https://github.com/celery/celery)
Tanto el servicio de trabajador como el de beat deben estar ejecutándose al mismo tiempo.
Inicie un servicio de trabajador de Celery (especifique el nombre de su proyecto Django):
$ apio -Un trabajador de [nombre-del-proyecto] --loglevel=info
Como proceso independiente, inicie el servicio beat (especifique el programador Django):
$ apio -A [nombre-proyecto] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
O puede usar -S (indicador del programador), para obtener más opciones, consulte celery beat --help
):
$ apio -A [nombre-del-proyecto] beat -l info -S django
Además, como alternativa, puede ejecutar los dos pasos anteriores (servicios de trabajador y de ritmo) con un solo comando (recomendado solo para entornos de desarrollo ):
$ apio -Un trabajador de [nombre-del-proyecto] --beat --scheduler django --loglevel=info
Ahora puedes agregar y administrar tus tareas periódicas desde la interfaz de administración de Django.
Puede instalar django-celery-beat a través del índice de paquetes de Python (PyPI) o desde la fuente.
Para instalar usando pip
:
$ pip install --upgrade django-celery-beat
Descargue la última versión de django-celery-beat desde http://pypi.python.org/pypi/django-celery-beat
Puedes instalarlo haciendo lo siguiente:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
Después de la instalación, agregue django_celery_beat
al módulo de configuración de Django:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Ejecute las migraciones django_celery_beat
usando:
$ python manage.py migrate django_celery_beat
Puede instalar la última versión principal de django-celery-beat usando el siguiente comando pip:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Para activar una copia de desarrollo local de django-celery-beat con el administrador de Django en http://127.0.0.1:58000/admin/ ejecute:
$ docker-compose up --build
Inicie sesión como usuario admin
con contraseña admin
.
Si tiene un proyecto que no utiliza zonas horarias, puede configurar DJANGO_CELERY_BEAT_TZ_AWARE=False
en su archivo de configuración.
Los mantenedores de django-celery-beat y miles de otros paquetes están trabajando con Tidelift para brindar soporte comercial y mantenimiento para las dependencias de código abierto que utiliza para crear sus aplicaciones. Ahorre tiempo, reduzca el riesgo y mejore la salud del código, mientras paga a los mantenedores de las dependencias exactas que utiliza. Obtenga más información.