Flask异步处理任务以及Logger处理日志

Flask作为一种轻量的Web服务框架,在很多场景下可以实现丰富的需求。本文将要介绍的是:

  1. 如何在Flask中进行异步处理?
  2. 如何使用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('...')
posted @ 2021-04-29 10:42  shayue111  阅读(561)  评论(0编辑  收藏  举报