Автоматический запуск очереди задач для 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:

  1. https://imamhossainroni.me/supercharge-your-process-management-using-supervisor
  2. http://supervisord.org/configuration.html
  3. Приложение Python/django не запускается с супервизором

Вторая команда после && выполняется только после завершения первой. Поскольку python manage.py runserver выполняется до тех пор, пока не будет прерван, python manage.py process_tasks никогда не будет выполнена.

У вас есть следующие возможности:

  1. Запустите python manage.py process_tasks в другом контейнере.
  2. Напишите сценарий оболочки, который выполняет команды параллельно, см. https://stackoverflow.com/a/58861363/92106.
  3. Используйте менеджер процессов, например circus или encab.
Вернуться на верх