首页 > 解决方案 > 在 Flask 应用程序中将初始化任务置于后台

问题描述

我正在从事一个数据科学项目,我需要在该项目中训练机器学习模型并提供一个 API 来访问模型对测试数据的预测。

到目前为止,我已经运行了所有东西,使用 Flask 提供一个 HTML 页面,其中包含对传递给它的测试数据的模型预测。我希望这个启动得更好。训练模型需要大量时间,并且 Flask 应用程序只是在之后才启动,这意味着在训练模型之前无法访问我的 API。到目前为止的启动顺序如下:

Read training database
Train model
Start Flask app

我想将此订单更改为

Start Flask app
Read training database
Train model

然后,当我localhost/?input=<xxx>在模型训练之前访问时,我想显示一条消息,例如“模型正在训练”。

我想我需要某种并行处理方案,我已经查看了多处理模块,但我不确定最好的方法。特别是,我如何model从后台进程中获取(参考)受过训练的人?鉴于p.join()我的代码结构如下:

import flask
from multiprocessing import Process
...

def get_trained_model():
    model = expensiveComputation()
    return model # I don't thing "return" is the right way to go??

if __name__ == '__main__':
    p = Process(target=get_trained_model)
    p.start()

    app = flask.Flask(__name__)

    @app.route('/', methods=['GET'])
    def home():
        if some_flag_that_model_ready:
            model = somehow_get_model_from_process()
            model_response = model.predict(method_to_get_test_data()).toString()
            return model_response
        else:
            return "model is still being trained"

    app.run()

这可以通过简单的方式完成,而不使用 RQ 或 Celery 等外部工具吗?这是正确的方法吗?

标签: pythonflaskparallel-processingbackground

解决方案


推荐阅读