Versão: | 2.7.0 |
---|---|
Rede: | http://django-celery-beat.readthedocs.io/ |
Download: | http://pypi.python.org/pypi/django-celery-beat |
Fonte: | http://github.com/celery/django-celery-beat |
Palavras-chave: | Django, aipo, batida, tarefa periódica, cron, agendamento |
Esta extensão permite armazenar o agendamento de tarefas periódicas no banco de dados.
As tarefas periódicas podem ser gerenciadas a partir da interface Django Admin, onde você pode criar, editar e excluir tarefas periódicas e com que frequência elas devem ser executadas.
As instruções de uso e instalação desta extensão estão disponíveis na documentação do Celery.
Aviso
Se você alterar a configuração TIME_ZONE
do Django, seu agendamento de tarefas periódicas ainda será baseado no fuso horário antigo.
Para corrigir isso, você teria que redefinir o "tempo da última execução" para cada tarefa periódica:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Observação
Isso redefinirá o estado como se as tarefas periódicas nunca tivessem sido executadas antes.
django_celery_beat.models.PeriodicTask
Este modelo define uma única tarefa periódica a ser executada.
Deve estar associado a um agendamento, que define a frequência com que a tarefa deve ser executada.
django_celery_beat.models.IntervalSchedule
Uma programação executada em um intervalo específico (por exemplo, a cada 5 segundos).
django_celery_beat.models.CrontabSchedule
Uma programação com campos como entradas no cron: minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Este modelo é usado apenas como um índice para acompanhar quando o cronograma foi alterado.
Sempre que você atualiza um PeriodicTask
um contador nesta tabela também é incrementado, o que informa ao serviço celery beat
para recarregar a programação do banco de dados.
Se você atualizar tarefas periódicas em massa, precisará atualizar o contador manualmente:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Para criar uma tarefa periódica executada em um intervalo, você deve primeiro criar o 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 ,
... )
Esses são todos os campos que você precisa: o tipo de período e a frequência.
Você pode escolher entre um conjunto específico de períodos:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Observação
Se você tiver várias tarefas periódicas em execução a cada 10 segundos, todas elas deverão apontar para o mesmo objeto de agendamento.
Há também uma "tupla de escolhas" disponível caso você precise apresentá-la ao usuário:
>> > IntervalSchedule . PERIOD_CHOICES
Agora que definimos o objeto de agendamento, podemos criar a entrada de tarefa 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.
... )
Observe que este é um exemplo muito básico, você também pode especificar os argumentos e argumentos de palavras-chave usados para executar a tarefa, a queue
para enviá-la [*] e definir um tempo de expiração.
Aqui está um exemplo especificando os argumentos, observe como a serialização JSON é necessária:
>> > 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 )
... )
[*] | você também pode usar o roteamento AMQP de baixo nível usando os campos exchange e routing_key . |
Uma programação crontab possui os campos: minute
, hour
, day_of_week
, day_of_month
e month_of_year
, portanto, se você deseja o equivalente a uma entrada crontab 30 * * * *
(executar 30 minutos após cada hora), você especifica:
>> > 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' )
... )
A programação do crontab está vinculada a um fuso horário específico usando o parâmetro de entrada 'timezone'.
Em seguida, para criar uma tarefa periódica usando esse agendamento, use a mesma abordagem da tarefa periódica baseada em intervalo anteriormente neste documento, mas em vez de interval=schedule
, especifique crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Você pode usar o sinalizador enabled
para desabilitar temporariamente uma tarefa periódica:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
As tarefas periódicas ainda necessitam de ‘trabalhadores’ para executá-las. Portanto, certifique-se de que o pacote Celery padrão esteja instalado. (Se não estiver instalado, siga as instruções de instalação aqui: https://github.com/celery/celery)
Os serviços de trabalho e de ronda precisam estar em execução ao mesmo tempo.
Inicie um serviço de trabalho do Celery (especifique o nome do seu projeto Django):
$ aipo -A [nome do projeto] trabalhador --loglevel=info
Como um processo separado, inicie o serviço beat (especifique o agendador Django):
$ aipo -A [nome do projeto] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
OU você pode usar o -S (sinalizador do agendador), para mais opções veja celery beat --help
):
$ aipo -A [nome do projeto] beat -l info -S django
Além disso, como alternativa, você pode executar as duas etapas acima (serviços de trabalho e de batida) com apenas um comando (recomendado apenas para ambiente de desenvolvimento ):
$ aipo -A [nome do projeto] trabalhador --beat --scheduler django --loglevel=info
Agora você pode adicionar e gerenciar suas tarefas periódicas na interface Django Admin.
Você pode instalar o django-celery-beat através do Python Package Index (PyPI) ou da fonte.
Para instalar usando pip
:
$ pip install --upgrade django-celery-beat
Baixe a versão mais recente do django-celery-beat em http://pypi.python.org/pypi/django-celery-beat
Você pode instalá-lo fazendo o seguinte:
$ 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 .
Após a instalação, adicione django_celery_beat
ao módulo de configurações do Django:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Execute as migrações django_celery_beat
usando:
$ python manage.py migrate django_celery_beat
Você pode instalar a versão principal mais recente do Django-celery-beat usando o seguinte comando pip:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Para iniciar uma cópia de desenvolvimento local do django-celery-beat com Django admin em http://127.0.0.1:58000/admin/ execute:
$ docker-compose up --build
Faça login como usuário admin
com senha admin
.
Se você tiver um projeto sem fuso horário, você pode definir DJANGO_CELERY_BEAT_TZ_AWARE=False
em seu arquivo de configurações.
Os mantenedores do django-celery-beat e de milhares de outros pacotes estão trabalhando com o Tidelift para fornecer suporte comercial e manutenção para as dependências de código aberto que você usa para construir seus aplicativos. Economize tempo, reduza riscos e melhore a integridade do código, enquanto paga os mantenedores das dependências exatas que você usa. Saber mais.