Автоматический запуск очереди задач для django-background-tasks
Я создаю приложение, в котором задействована очередь задач из django-background-tasks. Проблема, с которой я столкнулся, заключается в том, что я не могу запустить очередь автоматически и вынужден вручную запускать process_tasks
в контейнере приложения.
Я уже пробовал выполнить команду process_tasks
внутри моего Dockerfile, однако это, похоже, ничего не дало, так как открытые задачи не были разрешены.
CMD ["bash", "-c", "python manage.py runserver 0.0.0.0:8000 && python manage.py process_tasks"]
Сталкивался ли кто-нибудь с этой проблемой, и если да, то как вы с ней справились?
Я попытался выполнить команду process_tasks
в моем Dockerfile после выполнения runserver
, я ожидал, что это автоматически запустит очередь задач, однако это не дало никакого результата.
Проблема (Может быть):
Инструкция CMD
в вашем файле docker выполняет команды последовательно. Поскольку runserver
выполняется бесконечно, команда process_tasks
никогда не получит шанса запуститься.
Проблема, с которой вы сейчас столкнулись, заключается в том, что django-background-tasks
не запускается автоматически в контейнере докера из-за фоновой работы. Ваш текущий подход с CMD
может не быть оптимальным решением, и вы можете попробовать некоторые альтернативы, такие как:
Если бы я оказался в вашей ситуации, то выбрал бы supervisor
или celery
для одновременного выполнения фоновых задач.
1. Supervisor: Вы должны установить менеджер процессов типа supervisor в вашем докер-контейнере.Supervisord
обеспечит одновременный запуск runserver
и process_tasks
в фоновом режиме.
RUN pip install supervisor
# Supervisor configuration
COPY supervisord.conf /etc/supervisor/conf.d/
CMD ["supervisord", "-n"]
N.B: Вам необходимо создать supervisord.conf
файл с конфигурациями для runserver
и process_tasks
. Для этого можно погуглить.
2. Celery: Фоновые задачи Django могут быть интегрированы с Celery
, мощной распределенной очередью задач. Она предоставляет больше возможностей и контроля над фоновой обработкой, но требует дополнительных настроек.
Надеюсь, у вас появятся идеи для решения этой проблемы. Надеюсь, вам понравится экосистема Python/Django :)
Ref:
Вторая команда после &&
выполняется только после завершения первой. Поскольку python manage.py runserver
выполняется до тех пор, пока не будет прерван, python manage.py process_tasks
никогда не будет выполнена.
У вас есть следующие возможности:
- Запустите
python manage.py process_tasks
в другом контейнере. - Напишите сценарий оболочки, который выполняет команды параллельно, см. https://stackoverflow.com/a/58861363/92106.
- Используйте менеджер процессов, например circus или encab.