通常,我們使用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 :[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`
具體操作步驟:
- 在項目的根目錄建一個文件,命名爲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部署多進程服務的案例就結束了,當然,這只是一個簡單的使用。