Очистка результатов задач Celery¶
Celery сохраняет результаты выполнения задач в таблицу django_celery_results_taskresult. Без регулярной очистки таблица растёт неограниченно.
Механизм очистки¶
Очистка выполняется встроенной задачей Celery — celery.backend_cleanup. Задача вызывает метод delete_expired() бэкенда, который удаляет все записи, у которых date_done старше заданного срока.
Цепочка вызовов:
celery.backend_cleanup → app.backend.cleanup() → TaskResult.objects.delete_expired(expires) → get_all_expired(expires)
Настройка срока хранения¶
Срок хранения задаётся переменной окружения CELERY_RESULT_EXPIRES_DAYS (целое число, по умолчанию 14 дней).
Пример (файл .env):
CELERY_RESULT_EXPIRES_DAYS=14
Значение преобразуется в timedelta и устанавливается как CELERY_RESULT_EXPIRES в settings.py. Метод get_all_expired() использует именно эту настройку, если значение expires не было передано явно при вызове.
Расписание запуска¶
Задача celery.backend_cleanup запускается ежедневно в 04:00 через Celery Beat.
Задачу не нужно добавлять в beat_schedule вручную — DatabaseScheduler автоматически регистрирует её в таблице PeriodicTask при старте Beat (метод install_default_entries), если задана настройка CELERY_RESULT_EXPIRES.
Если задача уже существует в базе с enabled=False, Beat не включит её автоматически. В этом случае необходимо включить задачу вручную через Django Admin или командой:
from django_celery_beat.models import PeriodicTask
PeriodicTask.objects.filter(name='celery.backend_cleanup').update(enabled=True)
Ручной запуск¶
Для ручной очистки можно вызвать задачу через Django shell:
from planiqum.core.celery import app
app.backend.cleanup()
Или отправить задачу через Celery:
from celery import current_app
current_app.send_task('celery.backend_cleanup')
Связанные файлы¶
- /src/planiqum/core/settings_envs.py — дефолт
CELERY_RESULT_EXPIRES_DAYS - /src/planiqum/core/settings.py —
CELERY_RESULT_EXPIRES = timedelta(days=...) - /src/planiqum/core/django_celery_results/managers.py —
get_all_expired(),delete_expired()