首页 > 解决方案 > Python Flask 服务未并行执行所有函数调用

问题描述

我是 Python 新手,我正在尝试创建一个服务。

我已经使用 Flask 创建了一个服务,它对串行请求运行良好,但是当多个请求到来时,它会表现出一些奇怪的行为。在我的实际应用程序中,我观察到当多个请求频繁出现时,其他调用等待第一个调用完成,然后它们并行执行。

我试图重现这种行为并取得了一些成功。

这是示例代码:

from flask import Flask
from waitress import serve
import datetime
import pandas as pd

app = Flask(__name__)


@app.route("/get_data/")
def get_data():
    print("Request received at: " + str(datetime.datetime.now()))

    file_path = "D:\15MB_Data.csv"
    t1 = datetime.datetime.now()

    data_frame = pd.read_csv(file_path, ",")

    print("Starting processing after reading file at: " + str(datetime.datetime.now()))
    doSomeHeavyWork()

    t2 = datetime.datetime.now()
    init_time = 'Time in Initialization : ' + str((t2 - t1)) + ". Completed at " + str(datetime.datetime.now())
    print(init_time)

    return init_time


def doSomeHeavyWork():
    current_time_plus5 = datetime.datetime.now() + datetime.timedelta(0, 5)
    while datetime.datetime.now() < current_time_plus5:
        i = 0
    return 1


serve(app, host="0.0.0.0", port=5002)

要调用我使用的get_data函数:

http://127.0.0.1:5002/get_data

这个示例代码的输出是:

Request received at: 2021-11-10 15:26:32.482249
Starting processing after reading file at: 2021-11-10 15:26:32.875022
Request received at: 2021-11-10 15:26:33.112884
Request received at: 2021-11-10 15:26:33.485669
Request received at: 2021-11-10 15:26:33.804485
Starting processing after reading file at: 2021-11-10 15:26:36.032274
Starting processing after reading file at: 2021-11-10 15:26:36.438055
Starting processing after reading file at: 2021-11-10 15:26:37.089661
Time in Initialization : 0:00:05.444947. Completed at 2021-11-10 15:26:37.927196
Time in Initialization : 0:00:07.936492. Completed at 2021-11-10 15:26:41.049376
Time in Initialization : 0:00:08.023461. Completed at 2021-11-10 15:26:41.509130
Time in Initialization : 0:00:08.302279. Completed at 2021-11-10 15:26:42.120756

在输出中您可以清楚地看到,第二个请求是在2021-11-10 15:26:33.112884收到的,但它在2021-11-10 15:26 :36.032274开始处理,其他调用也一直在等待。

我在 Windows 10 上使用 pycharm 进行开发。我认为这可能是由于开发环境的原因,所以我尝试在 Ubuntu 上托管应用程序,也使用 Nginx,但仍然没有运气。

谁能让我知道在不等待第一次调用完成的情况下我应该怎么做才能执行这些请求?

标签: pythonflask

解决方案


waitress在线程池上运行请求,默认为4 个线程。由于日志显示 4 个请求,因此这不是限制。

doSomeHeavyWork实现没有 i/o 或睡眠的繁忙等待。由于GIL,Python 字节码的执行即使在不同的线程上也会阻塞(与 i/o 或大多数低级库相比)。如果这改为执行 i/o 或调用pandas/numpy类型操作(许多,不是全部释放 GIL),而不是忙于等待,阻塞时间会少得多。


推荐阅读