通常,我们使用flask起好了一个服务后,希望使用多进程来更高效的使用我们的服务,让我们的服务能更大的处理并发,这里记录使用uwsgi的一个简单的使用案例。

目录

  1. flask服务
  2. 编写uwsgi配置文件
  3. uwsgi使用
  4. 总结
  5. 参考

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 中,我们就可以这样访问我们的服务了

python confluent_kafka和多进程多线程 python flask 多进程_python


返回的数据结构如下:

{
    "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`

具体操作步骤:

  1. 在项目的根目录建一个文件,命名为uwsgi.ini,然后将配置信息粘贴上去;
  2. 修改scoker字段,需要使用端口(这个端口不用管falsk服务的端口);
  3. 修改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部署多进程服务的案例就结束了,当然,这只是一个简单的使用。

5. 参考

  1. https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Configuration.html
  2. https://www.jianshu.com/p/0e85cf58e677