zl程序教程

您现在的位置是:首页 >  后端

当前栏目

flask多进程,多线程部署接口程序

2023-09-11 14:14:26 时间

flask是一种方便快捷轻量级部署接口程序的工具,轻量级服务器架构,可以方便部署一个restful接口程序,供别人调用。

简单说下使用方式:
1 首先导入相应的包:

from flask import Flask, request
app = Flask(name)
app.config[‘JSON_AS_ASCII’] = False

2 给提供接口服务的函数加上修饰:

@app.route(’/app’, methods=[‘POST’])
def func():
pass

其中 '/app’是自己取的接口的名称,提供接口连接时使用:

if name = “main”:
app.run(host=‘0.0.0.0’, port=5001, debug=False)

app.run()启动接口
这样,就提供了http://0.0.0.0:5001/app/的服务接口,其中IP地址会自动绑定到程序运行所在机器的IP,端口号是5001,访问方式是post

多进程,多线程部署
通过配置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.findKeyword, content_list)
p.close()
p.join()

此处在接口的实现函数中又会用进程池创建8个子进程,此处无论flask是进程式还是线程式,都会另外创建8个子进程,处理完之后子进程会回收,不过值得注意的是,用pool创建进程池,以及进程之间的切换等等也会消耗时间,自测在处理一批批的文本数据时,如果每批文本数量比较少,比如只有几百个,直接循环处理某些情况下比建进程池多进程处理要快,所以要追求效率,进程的创建以及资源切换都要考虑到
客户端发送数据的格式需要与接收端的格式相对应,双方要约定好数据的格式,所以需要对提供的接口的调用字段格式及返回字段格式,提供相配套的接口说明文档,给需要调用服务的人员

gunicorn多进程多线程部署
另外,也可以配合gunicorn使用,在用gunicorn启动时,设置线程数,进程数,一般分布式稳定部署,通常是使用nginx+gunnicorn+flask的方式。可参考 Gunicorn介绍
安装好gunicorn后(pip install即可),启动命令参考示例:

 gunicorn --workers 3 --threads 2 --bind 0.0.0.0:5001 --timeout 1800 --error-logfile /data/flask/apps/myAPP/logs/gunicorn.log --log-level debug --capture-output --chdir /data/flask/apps/myAPP --reload --daemon /data/flask/apps/myAPP/MyServer.py

1
如上,指定了3个worker,2个线程,log输出文件,以及后台运行(daemon)+ 要运行的程序名称。
具体的参数也可以自行百度,此处只给个参考示例