【问题标题】:Returning 'still loading' response with Flask API使用 Flask API 返回“仍在加载”响应
【发布时间】:2019-01-29 13:19:44
【问题描述】:

我有一个scikit-learn 分类器作为Dockerised Flask app 运行,使用gunicorn 启动。它以 POST 请求的形式接收 JSON 格式的输入数据,并以结果的 JSON 对象进行响应。

当应用首次使用 gunicorn 启动时,会从数据库中读取一个大型模型 (serialised with joblib),并在应用准备好接受请求之前将其加载到内存中。这可能需要 10-15 分钟。

一个可重现的例子是不可行的,但基本结构如下图所示:

from flask import Flask, jsonify, request, Response
import joblib
import json

def classifier_app(model_name):
    # Line below takes 10-15 mins to complete
    classifier = _load_model(model_name)
    app = Flask(__name__)

    @app.route('/classify_invoice', methods=['POST'])
    def apicall():
        query = request.get_json()
        results = _build_results(query['data'])
        return Response(response=results,
                        status=200,
                        mimetype='application/json')

    print('App loaded!')
    return app

如何配置 Flask 或 gunicorn 以在 _load_model 仍在运行时向任何传入的 http 请求返回“仍在加载”响应(或适当的错误消息)?

【问题讨论】:

  • 你想创建一个进度条还是什么?
  • 您可以使用 Celery 异步处理 joblib 任务。您还需要安装充当任务队列的代理,例如 RabbitMQ 或 Redis
  • @Montreal 没有进度条 - 只是对 POST 请求的 http 响应。
  • @prithajnath 这听起来很有趣,但你能解释一下它是如何解决问题的吗?应用是在joblib任务运行的时候创建的,然后如果在模型存在之前有请求进来,我们可以返回错误吗?

标签: python flask scikit-learn gunicorn


【解决方案1】:

基本上,您希望为一个请求返回两个响应。所以有两种不同的可能性。

第一个是在后台运行耗时的任务,每两秒用简单的 ajax 请求 ping 服务器以检查任务是否完成。如果任务完成,返回结果,如果没有,返回"Please standby"字符串之类的。

第二个是使用websockets和flask-socketio扩展。

基本的服务器代码是这样的:

from threading import Thread
from flask import Flask

app = Flask(__name__)
socketio = SocketIO(app)

def do_work():
    result = your_heavy_function()
    socketio.emit("result", {"result": result}, namespace="/test/")

@app.route("/api/", methods=["POST"])
def start():
    socketio.start_background_task(target=do_work)
    # return intermediate response
    return Response()

在客户端你应该做这样的事情

var socket = io.connect('http://' + document.domain + ':' + location.port + '/test/');
socket.on('result', function(msg) {
    // Process your request here
});

有关详细信息,请访问this blog postflask-socketio documentation 获取服务器端参考和socketio documentation 获取客户端参考。

PS 使用 web-sockets 你也可以制作进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2021-02-25
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多