python 使用uwsgi 開啓多進程服務

通常,我們使用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    :[email protected]
# @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`

具體操作步驟:

  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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章