【Flask】算法服务接口部署及多线程优化


项目场景

基于 Python 开发了一个算法服务,如何通过 Flask 进行接口的部署及优化?

算法服务

模拟一个最简单的算法服务:通过线性拟合解决回归问题。输入 x,输出 y。(仅供模拟测试,实际业务场景会很复杂)

y = ax+ b
  • a:斜率
  • b:截距

斜率和截距可通过配置文件 config.yaml 调节。

params:
  a: 1
  b: 1

效果演示

http://127.0.0.1:5000/

在这里插入图片描述

http://127.0.0.1:5000/api/1/

在这里插入图片描述

http://127.0.0.1:5000/api/1,2,3/

在这里插入图片描述

网页部署

@app.route("/")
def hello_world() -> str:
    """Index

    Returns:
        str: Hello, World!
    """
    return "Hello, World!"


@app.route("/api/<x>/", methods=["GET", "POST"])
def api(x: str, path: str = 'config.yaml') -> jsonify:
    """Interface of the project

    Args:
        x (str): Request parameter
        path (str): Path of configuration file. Default to `config.yaml`

    Returns:
        jsonify: Format the data to JSON and return
    """
    # Params
    params = None
    while params == None:
        # When the yaml configuration file is being modified, it will return `None`
        params = yaml.load(open(path), Loader=yaml.FullLoader)
    a = params["params"]["a"]
    b = params["params"]["b"]
    # Params

    # Algorithm
    def func(x):
        time.sleep(1)
        y = a*float(x)+b
        return y
    # Algorithm

    # Data
    r = {"r": []}
    x = x.split(",")
    for i in x:
        if i != "":
            r["r"].append({"x": float(i), "y": func(i)})
        else:
            pass
    # Data
    return jsonify(r)

接口请求

请求地址

http://127.0.0.1:5000/api/<x>/

请求方式

GETPOST

请求参数

字段必需类型备注
x字符串URL 参数

请求样例

单个参数

http://127.0.0.1:5000/api/1/

{
  "r": [
    {
      "x": 1.0,
      "y": 2.0
    }
  ]
}

多个参数

http://127.0.0.1:5000/api/1,2,3/

{
  "r": [
    {
      "x": 1.0,
      "y": 2.0
    },
    {
      "x": 2.0,
      "y": 3.0
    },
    {
      "x": 3.0,
      "y": 4.0
    }
  ]
}

线程优化

对于多参数请求,即多个 x 请求,响应时间很长。为此,可以做一个多线程优化。

with concurrent.futures.ThreadPoolExecutor() as p:
        def temp(i):
            if i != "":
                r["r"].append({"x": float(i), "y": func(i)})
            else:
                pass
        for i in x:
            p.submit(temp, i)

开放源码

https://github.com/XavierJiezou/flask-algorithm-deploy

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过Python内置的Threading库来实现多线程。在Flask中,可以通过定义一个线程类,实现多线程操作,然后通过Flask的路由装饰器来启动或停止该线程。 下面是一个简单的示例代码: ```python from threading import Thread from flask import Flask, jsonify app = Flask(__name__) class MyThread(Thread): def __init__(self): super().__init__() self._stop_event = False def stop(self): self._stop_event = True def run(self): while not self._stop_event: # 线程执行的代码 print('Thread is running') @app.route('/start') def start_thread(): thread = MyThread() thread.start() return jsonify({'message': 'Thread started'}) @app.route('/stop') def stop_thread(): thread.stop() return jsonify({'message': 'Thread stopped'}) if __name__ == '__main__': app.run() ``` 在上面的代码中,我们定义了一个名为`MyThread`的线程类,它包含了一个`run()`方法,该方法是线程执行的代码。在`MyThread`类的`__init__()`方法中,我们定义了一个`_stop_event`变量,用于标记线程是否需要停止。在`stop()`方法中,我们将`_stop_event`设置为`True`,以停止线程。 在Flask中,我们使用路由装饰器来定义两个路由:`/start`和`/stop`。当用户访问`/start`时,我们创建一个新的`MyThread`实例并启动它。当用户访问`/stop`时,我们调用该线程的`stop()`方法来停止它。 当然,这只是一个简单的示例代码,实际应用中可能需要更加复杂的线程操作和逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xavier Jiezou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值