Flask作爲一種輕量的Web服務框架,在很多場景下可以實現豐富的需求。本文將要介紹的是:
- 如何在Flask中進行異步處理?
- 如何使用Logger在Flask服務中打印日誌。
異步處理
使用Flask提供服務時,如果要處理的任務佔用時間很長,一般的做法會通知客戶端收到接口調用,然後等任務跑完,再將結果以請求的方式,調用客戶端進行返回。
在這個場景下,在flask中使用ProcessPoolExecutor
能解決上述的需求。
具體的代碼框架如下:
import flask
from concurrent.futures import ProcessPoolExecutor
# 初始化app
app = flask.Flask(__name__)
# 初始化進程池
executor = ProcessPoolExecutor(2)
def helper():
# 業務處理函數
# 如果helper有結果需要返回,可以如下進行
"""
import requests
...
# URL爲調用的地址,返回內容爲d,可以是列表類型
requests.post(URL, json=d)
"""
pass
@app.route("/algo", methods=["GET", "POST"])
def predict():
# 獲取請求參數
params = flask.request.json
if params is None:
return flask.jsonify({'success': False, 'errMsg': "請求錯誤,存在字段全爲空。"})
elif len(params.keys()) == 1:
return flask.jsonify({'success': False, 'errMsg': "收到字段{}, 缺少另一個字段!".format(list(params.keys())[0])})
else:
print("接收信息...")
# 啓動另一個進程處理
executor.submit(helper, params)
# 通知客戶端正在處理
return flask.jsonify({'status': True})
if __name__ == "__main__":
app.run(
host='0.0.0.0',
port=5000,
debug=True
)
Logger打印
class MyLogger:
"""
自定義日誌打印類,將日誌保存到`../logs/`目錄
"""
def __init__(self):
# 創建Logger
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
# 終端Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 文件Handler
file_handler = logging.FileHandler(
filename='PATH/execute.log',
mode='a+',
encoding='UTF-8'
)
file_handler.setLevel(logging.NOTSET)
# Formatter
formatter = logging.Formatter(
fmt='%(asctime)s --- %(levelname)s - %(message)s',
datefmt="%Y-%m-%d %H:%M:%S"
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加到Logger中
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
# 生成日誌打印實例
LOGGER = MyLogger()
LOGGER.logger.info('...')