Flask 处理高并发、多线程


 

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM