FastAPI/任何其他后端框架如何处理多个并发请求?

问题描述 投票:0回答:1

我试图了解 FastAPI 或任何其他后端框架如何处理多个并发用户请求。我已经构建了一个全栈 ML 癌症预测应用程序,该应用程序对于一个用户来说效果很好,但我正在考虑它如何从根本上扩展和服务多个用户。我已经在 FastAPI 中编写了 API 路由,其中之一是处理用户上传,另一个是预测。这是代码:

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    path = Path(__file__).parents[1] / "saved_images" / file.filename
    try:
        with path.open("wb") as buffer:
            shutil.copyfileobj(file.file, buffer)
    except Exception as e:
        print("Error: ", e)
    global current_filename
    current_filename = file.filename
    return {"filename": file.filename}

@app.get("/predict/")
async def predict(filename: str):
    path = Path(__file__).parents[1] / "saved_images" / filename
    path = str(path)
    models = utils.get_models_list()
    dataset_test = DatasetTest(df_single_image, 'test', 'test', transform=transforms_test)
    image = dataset_test[0]
    prediction, probs = utils.predict_single_image(image, models)
    return {"Probs": probs,
            "Prediction": prediction}

针对每个测试样本/图像运行

predict
路线大约需要 2 分钟。我这里有两个基本问题:

i) 如果两个用户同时使用

upload
路线上传图像怎么办? FastAPI 是如何处理的?

ii)假设两个用户将图像上传到文件系统,现在他们同时使用

predict
路由,FastAPI 如何处理这个问题以及主要问题 - 它如何确定向哪个用户返回哪个响应(假设我不知道)没有适当的身份验证系统,因此任何用户都可以进入网络应用程序并开始使用它)?

此外,这是我用来发送这些请求的前端组件:

const PredictButton = () => {
    const selectedFile = useContext(FileContext);
    const [pred, setPred] = useState(null);

    const handleUpload = async () => {
        const formData = new FormData();
        formData.append("file", selectedFile, selectedFile.name);

        const requestOptions = {
            method: 'POST',
            body: formData,
        };
        await fetch('http://localhost:8000/uploadfile', requestOptions);
    }
    const handlePredict = async () => {
        await handleUpload();
        const requestOptions = {
            method: 'GET',
        };
        const resp = await fetch(`http://localhost:8000/predict/?filename=${selectedFile.name}`, requestOptions);
        const data = await resp.json();
        setPred(data["Prediction"]);
    }
    return (
        <div className="predict-button">
            <button className="predict-button-button" onClick={handlePredict}>Predict!</button>
            <div className="pred">
                {pred===null ? null : (pred === 1 ? <div className="detected">Prediction: Cancer Detected</div> : <div className="no-detected">Prediction: No cancer Detected</div>)}
            </div>
        </div>
    )
}

如果有人能帮助我消除这些基本疑虑,那就太好了。

asynchronous concurrency backend fastapi
1个回答
0
投票

快速演示 API 并发处理请求的速度并确定 哪个用户在多用户环境中得到响应。

我们来说吧

当两个用户同时上传他们的图像

/uploadfile/
路线时,
FASTAPI
将使用
event loop
来管理并发请求,并且每个请求都单独处理并确保请求不会互相干扰。 https://fastapi.tiangolo.com/async/

具体说明如何以及为何:

  • FastAPI 
    运行协调异步路径函数的异步事件循环,以及用于同步路径函数的
    threadpool (group of workers to do tasks in parallel)

  • 当一个用户发出请求时,FASTAPI 不会等待请求完成后再处理下一个请求。 (就像一家有多个厨师的餐厅,请求就像订单一样,由线程池同时处理)也称为

    Asynchronous Handling

  • 由于 FASTAPI 没有任何身份验证,它会平等对待所有请求,但不会混淆请求。如果您没有任何

    RBAC or authentication or user identification
    机制,它将按照
    First-come First served
    时尚方式处理请求。

  • Production
    中,用户管理和身份验证对于保持用户数据的分离和安全至关重要。

希望这对您有帮助,如果您有任何疑问,请告诉我们!

© www.soinside.com 2019 - 2024. All rights reserved.