#python #flask #gunicorn #wsgi #flask-socketio
#python #flask #gunicorn #wsgi #flask-socketio
Вопрос:
Я разработал приложение Flask, и оно довольно хорошо работает на стадии разработки, но когда я настроил производственный процесс с помощью Gunicorn, производительность сильно снизилась.
Я следовал этому руководству, чтобы начать работу с Gunicorn.
Мое приложение использует socket-io, поэтому сервер обрабатывает запросы в режиме реального времени в режиме разработки, как и было задумано, но с Gunicorn запросы даже сильно задерживаются или вообще не доходят до сервера.
Я запускал Gunicorn по-разному, менял рабочих, потоки и приложение следующим образом.
sudo gunicorn --bind 0.0.0.0:5000 --workers 2 wsgi:app
sudo gunicorn --bind 0.0.0.0:5000 --workers 2 app:app
sudo gunicorn --bind 0.0.0.0:5000 --workers 3 --threads 3 wsgi:app
sudo gunicorn --bind 0.0.0.0:5000 --workers 3 --threads 3 app:app
sudo gunicorn --bind 0.0.0.0:5000 --workers 8 --threads 4 wsgi:app
sudo gunicorn --bind 0.0.0.0:5000 --workers 8 --threads 4 app:app
мой wsgi.py
:
from app import app
if __name__ == '__main__':
app.run()
мой app.py
:
#!/usr/bin/env python
from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.url_map.strict_slashes = False
socketio = SocketIO(app)
from control.control import *
from video_streaming import video_streaming_blueprint
app.register_blueprint(video_streaming_blueprint)
def disable_logs(app, disable):
import logging
log = logging.getLogger('werkzeug')
log.disabled = disable
app.logger.disabled = disable
if __name__ == '__main__':
disable_logs(app=app, disable=True)
socketio.run(app=app, host='0.0.0.0', debug=False)
- Сервер работает на локальной машине.
Ответ №1:
Пакет Flask-SocketIO содержит подробные инструкции по развертыванию.
Для обеспечения хорошей производительности вам необходимо добавить WebSocket на ваш сервер. Для этого вам придется использовать асинхронный рабочий процесс для gunicorn, либо gevent, либо eventlet.
Использование более одного рабочего элемента возможно, но часто не обязательно, поскольку асинхронные рабочие элементы обрабатывают свою собственную последовательность. Если вы хотите использовать несколько рабочих элементов, вам необходимо добавить балансировщик нагрузки, такой как nginx, и очередь сообщений, такую как redis или rabbitmq.