периодическая задача с использованием сельдерея для удаления результата набора запросов

Я пытаюсь выполнить периодическую задачу, используя сельдерей, чтобы удалить пользователей, которые вовремя не активировали свою учетную запись. На приведенном ниже снимке экрана показано, что задача обнаружена и выполнена правильно, но когда я проверяю базу данных, никаких изменений не происходит.

Задача сельдерея:

#tasks.py
from celery.task.schedules import crontab
from celery.decorators import periodic_task
from celery.utils.log import get_task_logger
from .utils import unconfirmed_users_delete

logger = get_task_logger(__name__)

# A periodic task that will run every minute (the symbol "*" means every)
@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))
def delete_unconfirmed_users():
    return unconfirmed_users_delete()

Набор запросов для выполнения (проверен в оболочке django и работает правильно):

#utils.py
from django.contrib.auth.models import User
from django.utils import timezone

def unconfirmed_users_delete():
    return User.objects.filter(is_active=False).filter(profile__key_expires__lt=timezone.now()).delete()

Задача корректно вызывается каждую минуту:

введите здесь описание изображения

Что может быть не так?


person Khalil An    schedule 05.05.2015    source источник
comment
У вас есть работник, работающий рядом с вашим процессом celery beat?   -  person schillingt    schedule 05.05.2015
comment
@schillingt Да, у меня есть один, но я внес некоторые изменения в файлы задач и утилит и забыл перезапустить его. Пожалуйста, напишите свой комментарий в качестве ответа, чтобы я мог принять его.   -  person Khalil An    schedule 05.05.2015


Ответы (1)


Как часто упоминал @schillingt, мы забываем (повторно) запускать рабочий процесс для периодической задачи.

Это происходит потому, что у нас есть планировщик ударов, который планирует задачу, и рабочий, который выполняет задачу.

celery -A my_task beat  # schedule tasks
celery worker -A my_task -l info  # consume tasks

Гораздо лучшим решением является наличие работника, который планирует задачу и выполняет ее. Вы можете сделать это, используя

celery worker -A my_task -l info --beat  # schedule & consume tasks

Это планирует периодическую задачу и потребляет ее.

person ChillarAnand    schedule 06.05.2015
comment
Может ли рабочий процесс запускать запланированные задачи, если в данный момент он сам выполняет задачу? Если нет, то, хотя этот подход, вероятно, подходит для разработки, этот подход, вероятно, не следует рекомендовать для производства. Мне любопытно знать. - person Dwight Gunning; 07.05.2015
comment
@dwightgunning Я также стараюсь избегать этого подхода, потому что обычно планирование задачи очень важно для бизнес-процесса, и перегрузка работника другими задачами может создать проблемы в точном планировании. - person Mauro Rocco; 07.05.2015