Перейти к содержанию

Очистка результатов задач 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')

Связанные файлы