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('...')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章