通常,我们使用flask起好了一个服务后,希望使用多进程来更高效的使用我们的服务,让我们的服务能更大的处理并发,这里记录使用uwsgi的一个简单的使用案例。
目录
- flask服务
- 编写uwsgi配置文件
- uwsgi使用
- 总结
- 参考
1.创建一个简单的flask服务
这里我们模拟一个简单分词的HTTP服务,服务的输入输出如下:
用户输入: 字符串的query
服务输出: 分词结果
服务的代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 中文分词的 flask http 服务
# @Time : 2020/4/2 14:59
# @Author : macan
# @Mail :ma_cancan@163.com
# @File : flask_seg_service.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import flask
from flask import jsonify, request
import jieba
app = flask.Flask(__name__)
def encode_response(code=0, msg="ok", data=None):
"""
编码服务返回接口的数据结构
:param code:
:param msg:
:param data:
:return:
"""
if data is None:
data = {}
return {"code": code, "message": msg, "data": data}
def analysis(query):
"""
http服务的逻辑
:param query:
:return:
"""
if not query:
response = encode_response(msg="query must input")
else:
try:
seg_list = list(jieba.cut(query))
response = encode_response(data={"seg": seg_list})
except Exception as e:
response = encode_response(code=1, msg=str(e))
return response
@app.route('/zh_seg_service_get', methods=["GET"])
def zh_seg_service_get():
query = request.args.get("query", "")
response = analysis(query)
return jsonify(response)
@app.route('/zh_seg_service_post', methods=["POST"])
def zh_seg_service_post():
query = request.form.get("query", "")
response = analysis(query)
return jsonify(response)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=12345)
这个例子中,我们使用flask封装了一个HTTP服务,服务的端口是12345, 其支持post和get方法。
- post的URL: http://ip:12345/zh_seg_service_post
- get的URL: http://ip:12345/zh_seg_service_get
需要注意的是
- get请求获取数据是通过flask.request.args
- post请求获取数据是通过flask.request.form
postman 访问
在postman 中,我们就可以这样访问我们的服务了
返回的数据结构如下:
{
"code": 0,
"data": {
"seg": [
"爱",
"中国"
]
},
"message": "ok"
}
curl请求
- get:
curl "http://127.0.0.1:12345/zh_seg_service_get?query=我爱中国"
2.配置uwsgi 多进程服务
写好了falsk服务后,uwsgi的服务配置文件千篇一律,下面是一个我常用的demo
#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=0.0.0.0:12345
#配置项目路径,项目的所在目录
chdir=${app_path}
#配置启动的进程数
processes=4
#配置每个进程的线程数
#threads=4
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi/app.pid
#配置dump日志记录
daemonize=./uwsgi/app.log`
具体操作步骤:
- 在项目的根目录建一个文件,命名为uwsgi.ini,然后将配置信息粘贴上去;
- 修改scoker字段,需要使用端口(这个端口不用管falsk服务的端口);
- 修改processes 字段,指定进程数
3. 启动uwsgi多进程
关于uwsgi有三个常见的命令,开启,关闭,重新加载。重新加载相当于关闭然后开启的组合。下面就介绍这三个常见命名的用法。
3.1 启动
uwsgi --ini uwsgi.ini
3.2 关闭
在uwsgi.ini配置文件中,有一个pidfile的参数,这个参数记录了master进程的pid号码,当我们需要停掉这个多进程的服务的时候,使用下面的命令
uwsgi --stop ./uwsgi/app.pid
stop后面的参数和pidfile参数值是一样的。
3.3 重启
uwsgi --reload ./uwsgi/app.pid
3.4 查看日志
使用uwsgi启动的服务,其所有的logger, print都会被记录到log文件中,log文件的配置参数是daemonize参数,如我的配置文件,想看log的话
tail -f ./uwsgi/app.log
4. 总结
至此,如何使用uwsgi部署多进程服务的案例就结束了,当然,这只是一个简单的使用。