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 позволяет избежать простоя в ожидании операций ввода-вывода.