问题描述
我已经开发了Flask应用程序,并且在开发阶段运行良好,但是当我使用Gunicorn设置生产过程时,性能下降了很多。
我跟随this tutorial跟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)
- 服务器在本地计算机上运行。
解决方法
Flask-SocketIO软件包中有详细的deployment instructions。
要获得良好的性能,您需要将WebSocket添加到服务器。为此,您将必须为gunicorn使用非同步工作程序,无论是gevent还是eventlet。
可以使用一个以上的工作程序,但是通常不是必需的,因为异步工作程序会处理自己的并发性。如果确实要使用多个工作进程,则需要添加一个负载均衡器(例如nginx)和一个消息队列(例如redis或Rabbitmq)。