python - Gunicorn 限制服务器性能
问题描述
我开发了一个 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)
- 服务器在本地机器上运行。
解决方案
Flask-SocketIO 包有详细的部署说明。
要获得良好的性能,您需要将 WebSocket 添加到您的服务器。为此,您将不得不为 gunicorn 使用异步工作器,gevent 或 eventlet。
使用多个工人是可能的,但通常没有必要,因为异步工人处理自己的并发性。如果你确实想使用多个worker,那么你需要添加一个负载均衡器比如nginx和一个消息队列比如redis或rabbitmq。
推荐阅读
- java - 有没有更好的迭代方法来找到可整除的数?
- c# - Azure Build 代理找不到类库参考
- python-3.x - AttributeError:“NoneType”对象在从表单插入时没有属性
- angular - 无法在与 Angular 中的组件相同的文件夹中显示静态图像
- c# - 删除所有连接的子实体
- javascript - Camera Roll adding borderColor
- r - force the evaluation of .SD in data.table
- ember.js - Ember 服务:每个端口都在使用中
- r - Is parallel processing a solution for RAM shortage in R due to a large dataset?
- python - 如何使用模块 Re 在 python 中调整“时间”