zoukankan      html  css  js  c++  java
  • 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('...')
    
  • 相关阅读:
    延时调用的php代码
    mysql 官网下载太慢了,来这里!!!
    解决react-native 运行报错:Entry, ":CFBundleIdentifier", Does Not Exist
    mongodb增删改查常用命令总结
    Linux 查看文件内容(8)
    Linux mv命令(7)
    Linux文件拷贝(6)
    Linux 创建与删除(5)
    Linux cd命令(4)
    ls 命令通配符(3)
  • 原文地址:https://www.cnblogs.com/shayue/p/14717011.html
Copyright © 2011-2022 走看看