Flask异步处理任务以及Logger处理日志
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('...')