|
flask服务器的启动与使用Gunicorn容器
app.run 的参数
app.run(host="0.0.0.0", port=5001, debug=False, processes=2, threaded=False)
注意:绝对不能在生产环境中使用调试器
host设定为0.0.0.0,则可以让服务器被公开访问
port:指定端口号,默认为5000
debug:是否开启 debug 模型,如果你打开 调试模式,那么服务器会在修改应用代码之后自动重启,并且当应用出错时还会提供一个 有用的调试器。
processes:进程数量,默认是1
threaded:bool类型,是否开启多线程。注:当开启多个进程时,不支持同时开启多线程。
使用 route() 装饰器来告诉 Flask 触发函数的 URL;
函数名称被用于生成相关联的 URL。函数最后返回需要在用户浏览器中显示的信息
当我们执行上面的app.run()时,使用的flask自带的服务器,完成了 web 服务的启动。
在生产环境中,flask 自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部署flask程序
Gunicorn(绿色独角兽)是一个Python WSGI UNIX HTTP服务器。
从 Ruby 的独角兽(Unicorn )项目移植。该Gunicorn服务器作为wsgi app的容器,能够与各种 Web 框架兼容,实现非常简单,
轻量级的资源消耗。Gunicorn 直接用命令启动,不需要编写配置文件,相对 uWSGI 要容易很多
pip3 install gunicorn
如果想让Gunicorn支持异步workers的话需要安装以下三个包:
pip3 install gevent
pip3 install eventlet
pip3 install greenlet
指定进程和端口号,启动服务器:
gunicorn -w 4 -b 127.0.0.1:5001 运行文件名称:Flask程序实例名
以上述 hello.py 文件为例:
gunicorn -w 4 -b 127.0.0.1:5001 hello:app
参数:-w: 表示进程(worker)。-b:表示绑定 ip 地址和端口号(bind)
查看 gunicorn 的具体参数,可执行gunicorn -h 通常将配置参数写入到配置文件中,如gunicorn_conf.py
重要参数:
bind: 监听地址和端口
workers: worker 进程的数量。建议值:2~4 x (NUM_CORES),缺省值是 1.
worker_class:worker 进程的工作方式。有:sync (缺省值),eventlet, gevent, gthread, tornado
threads:工作进程中线程的数量。建议值:2~4 x (SUM_CORES),缺省值是 1.
reload: 当代码有修改时,自动重启 workers。适用于开发环境,默认为False
daemon:应用是否以daemon方式运行,是否以守护进程启动,默认False
accesslog:访问日志文件路径
errorlog:错误日志路径
loglevel:日志级别。debug, info, warning, error, critical.
if __name__ == "__main__":
load_known_face_encodings_names()
app.run(debug=False) # 使用gunicorn了
# app.run(host='0.0.0.0', port=5001, debug=False)
# 注意:绝对不能在生产环境中使用调试器 processes:线程数量,默认是1
# threaded:bool类型,是否开启多线程。注:当开启多个进程时,不支持同时开启多线程。
# app.run(host="0.0.0.0", port=5001, debug=False, processes=1, threaded=False)
# app.run(host='172.20.7.25', port=5001, debug=False)
# gunicorn -w 4 -b 127.0.0.1:5001 web_server_facenet_keras_small:app
# gunicorn -c gunicorn_conf_small.py web_server_facenet_keras_small:app
gunicorn --config gunicorn_conf_small.py web_server_facenet_keras_small:app
- # -*- coding: utf-8 -*-
- __author__ = u'东方耀 微信:dfy_88888'
- __date__ = '2020/5/19 上午11:15'
- __product__ = 'PyCharm'
- __filename__ = 'gunicorn_conf_small'
- bind = '0.0.0.0:5001' # 监听地址和端口号
- backlog = 2048
- workers = 2 # 进程数
- worker_class = 'sync' # 工作模式,可选sync, gevent, eventlet, gthread, tornado等
- threads = 1 # 指定每个进程的线程数,默认为1
- worker_connections = 2000 # 最大客户并发量
- timeout = 200 # 超时时间,默认30s
- keepalive = 2 # 默认值
- reload = True # 开发模式,代码更新时自动重启
- daemon = False # 守护Gunicorn进程,默认False
- accesslog = './logs/access.log' # 访问日志文件
- errorlog = './logs/error.log'
- loglevel = 'debug' # 日志输出等级,debug, info, warning, error, critical
复制代码
问题1:
使用 Flask 启动服务,加载两次模型,占用两份显存
出现该问题的原因是使用Flask启动服务的时候,开启了 debug 模式,即debug=True。dubug模式会开启一个tensorflow的线程,此时查看 GPU 显存占用情况,会发现有两个进程都占用相同份的显存。
关闭 debug 模型(debug=False)即可
app.run(debug=False) # 使用gunicorn了
问题2:
无法启动服务,[CRITICAL] WORKER TIMEOUT
当使用 gunicorn 启动 flask 服务时,查看服务器状态和日志文件发现一直在尝试启动,但是一直没有成功。
CRITICAL WORKER TIMEOUT
这是 gunicorn 配置参数timeout导致的。默认值为30s,即超过 30s,就会 kill 掉进程,然后重新启动restart。
当启动服务进行初始化的时间超过 timeout 值时,就会一直启动,kill, restart。
可根据具体情况,适当增加该值。 比如我调整为200s
|
|