gevnet、gunicorn部署flask

gevent、gunicorn部署Flask服务

flask作为一个轻量级的框架简直不要方便!

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    time.sleep(10)
    return 'Hello World!'

@app.route('/index')
def beijing():
    return 'Beijing'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001,threaded=False)
    #app.run(host='0.0.0.0', port=5001)

网上很多说flask只能是同步不支持并发,感觉很坑呀,app.run这里的threaded参数,经过我的测试,默认其实是True,对多个服务其实会开启多个线程来处理.

1、使用threaded=False时候

用浏览器先后访问127.0.0.1:5001和127.0.0.1:5001/index时,index路由确实要等’/'路由运行才出来,说明False的时候是同步的,两次服务是串行的,这个时候不支持并发

2、threaded=True或者不写threaded参数

用浏览器先后访问127.0.0.1:5001和127.0.0.1:5001/index时,index立马出来,说明是并发的,这里有个坑,注意一下,就是用浏览器同时访问127.0.0.1:5001,这个时候是无法并发的,这里我怀疑了好几天,为啥同一个路由就不并发,后来发现时浏览器的坑,可以用别的 测试工具试试,其实是并发,只不过相同的参数和url浏览器会将这两个请求作为一个请求所以是串行的。不放心可以这样试试,将’/'路由的函数修改GET并传入参数。

@app.route('/')
def hello_world():
    para = request.args.get("time", type=int)
    time.sleep(para)
    return 'Hello World!'

用浏览器访问127.0.0.1:5001?time=10127.0.0.1:5001?time=9,你会发现这个时候同时返回结果,所以说,flask自身是并发的框架,可以用多线程实现。

flask开发速度快,但是自带的WSGI服务器性能极弱,尤其在压力测试,空接口一千并发都无法通过,百分之4.9无法通过。

image-20210325101858433

接下来我们用gunicorn+gevent的方式部署,其中Genvent库是接收http request时,开启新的协程处理,避免开启线程频繁开销。Flask内置web服务器是单个 Worker,只有一个进程在跑所有的请求,内置 webserver 很容易卡死,并且只有一个 Worker 在跑请求,在多核 CPU 下,仅仅占用一核,Gunicorn 可以调节 Worker 的数量(多个线程)并管理,一个 master 进程管理多个 worker 进程,所有请求和响应均由 Worker 处理,Master 进程是一个简单的 loop, 监听 worker 不同进程信号并且作出响应。比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,则重启失败的 worker, 同步的 Worker 一次处理一个请求。

具体部署流程如下,安装gevent和gunicorn,直接用pip install gevent gunicorn即可,安装完后,增加一个gun.py文件在你的app路径下,内容如下,可以根据需求增加一些其他参数

import multiprocessing
backlog = 8192
workers = multiprocessing.cpu_count()*2+1
worker_class = "gevent" #使用gevent模式,开启多协程
bind = "0.0.0.0:5001"
worker_connections = 2000

最后直接使用以下命令部署即可,不需要再启动原来的服务,只用gunicorn启动就行,第一个app表示你flask服务的文件名,第二个表示你服务中应用的app的变量名,这个两个名称一致而已,可以根据自己需求命名。

gunicorn -c gun.py app:app

最后压力测试结果如下,1000并发,loop10次,大幅度提高,但是这个也是吃了不少内存资源的和cpu资源的。

image-20210325104047498

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值