Django-plotly-dash мультисессия на страницах с интенсивным процессором

Запуск - django-plotly-dash У меня есть многополюсные страницы python, проблема в том, что когда я загружаю одну из страниц, пока она выполняет некоторые вычисления, я не могу запустить ту же страницу или другие страницы из другой сессии, и веб-сервер не отвечает для других пользователей. если я посмотрю на вывод runserver, он занят рендерингом только первого запроса.

Если я посмотрю на вывод runserver, то он занят отрисовкой только первого запроса.

Если я правильно понимаю, это означает, что вы используете сервер разработки Django, и, следовательно, что вы находитесь в разработке (если вы используете django-admin runserver в производстве, это серьезная проблема).

Сейчас самое время отметить: не используйте этот сервер ни в чем, напоминающем производственную среду. Он предназначен только для использования в процессе разработки. (Мы занимаемся созданием веб-фреймворков, а не веб-серверов).

Сервер разработки Django должен быть многопоточным и поддерживать одновременные запросы. Однако, из своего опыта я заметил, что он может обрабатывать только один запрос за раз. Я не копался в этом слишком долго, но предполагаю, что это может быть вызвано приложением, которое переопределяет команду runserver и отключает многопоточность

В разработке это не должно быть слишком большой проблемой. А в производстве вы не будете страдать от такого рода блоков, поскольку настоящие WSGI-серверы, такие как gunicorn, смогут обрабатывать несколько одновременных запросов (при условии, что он настроен на правильное использование доступных ресурсов, а аппаратное обеспечение способно справиться с нагрузкой)

Однако если ваши страницы действительно медленно отвечают, это может стать проблемой для пользователя, загружающего страницу, а также потребовать больше ресурсов для обработки большего количества одновременных запросов. Все зависит от того, что значит "медленно" - 2 секунды, 5 секунд, 30 секунд или даже больше. Уменьшение времени отклика во многом зависит от узкого места вашего кода и может включать в себя:

  • Оптимизация алгоритмов
  • Редуцирование и оптимизация SQL-запросов (См. Оптимизация доступа к базе данных)
  • Откладывание на Celery вычислений, которые не влияют на ответ
  • Использование вебсокетов для передачи и отображения данных по мере их вычисления без блокирования клиента до тех пор, пока не будет вычислена вся страница. (См. django-channels)
  • Использование asyncio позволяет избежать простоя в ожидании операций ввода-вывода.
Вернуться на верх