https://zhuanlan.zhihu.com/p/102716258
Gunicorn介绍
压力测试 多线程测试
https://www.jianshu.com/p/79489cfc6fb9
1.通过设置app.run()的参数,来达到多线程的效果,具体参数:
# 1.threaded : 多线程支持,默认为False,即不开启多线程; app.run(threaded=True) # 2.processes:进程数量,默认为1. app.run(processes=True) ps:多进程或多线程只能选择一个,不能同时开启
多进程,多线程部署
通过配置app.run()中的参数实现多进程或者多线程部署,默认是多线程的,即多个客户端同时调用访问restful接口,这个服务程序是以多线程方式处理的
可以通过修改:
app.run(host=‘0.0.0.0’, port=5001,debug=False,threaded = False,processes=5)
配置为多进程处理,如上,多个客户端同时访问的话,是多进程处理,如此出processes=5,是最多支持5个客户端同时访问,超过了就需要等待处理完或者直接不处理,客户端会得不到响应。所以此处processes可以根据实际情况配置的大一点,比如几百甚至上千。
需要特别注意的是,此处必须同时配置threaded = False和processes的个数,将多线程模式禁用同时开启多进程模式,否则会编译报错
除此之外,还可以在程序中自己创建多进程,比如:
@app.route('/app', methods=['POST'])
def func():
records = request.json['record']
content_list = [record['content'] for record in records]
id_list = [record['id'] for record in records]
from multiprocessing import Pool
p = Pool(8)
result = p.map(cse_obj.findeKword, content_list)
p.close()
p.join()
此处在接口的实现函数中又会用进程池创建8个子进程,此处无论flask是进程式还是线程式,都会另外创建8个子进程,处理完之后子进程会回收, 不过值得注意的是,用pool创建进程池,以及进程之间的切换等等也会消耗时间,自测在处理一批批的文本数据时,如果每批文本数量比较少,比如只有几百个,直接循环处理某些情况下比建进程池多进程处理要快,所以要追求效率,进程的创建以及资源切换都要考虑到
客户端发送数据的格式需要与接收端的格式相对应,双方要约定好数据的格式,所以需要对提供的接口的调用字段格式及返回字段格式,提供相配套的接口说明文档,给需要调用服务的人员
2.使用genvent做协程,解决高并发:
from genvent.wsgi import WSGIServer
from genvent import monkey
monkey.patch_all()
app = Flask(__name__)
app.config.from_object(config)
api = Api(app)
db = DBInfo()
# db_old = DBInfo_old()
然后通过这种方式包装WSGIServer((address,port), app).serve_forever()
通过python code.py 的方法,来启动服务
3.通过Guicorn(with genvent)的形式来对app进行包装,来启动服务;
https://zhuanlan.zhihu.com/p/102716258
通过一下代码,来启动项目
# 启动命令
gunicorn -c gun.py thread_explore:app
其中gun.py是gunicorn的配置文件
thread_explore是服务的主程序
app是flask的app
gun.py的具体内容:
import os
import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing
# 服务地址(adderes:port)
bind = 127.0.0.1;5000
# 启动进程数量
workers = multiprocessing.cpu_count() * 2 +1
worker_class = 'gevent'
threads = 20
preload_app = True
reload = True
x_forwarded_for_header = 'X_FORWARDED-FOR'
ps:这里启动进程数量应该是根据CPU个数来确定的,最好是2 * CPU数 + 1