我试图了解 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>
)
}
如果有人能帮助我消除这些基本疑虑,那就太好了。
快速演示 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
中,用户管理和身份验证对于保持用户数据的分离和安全至关重要。
希望这对您有帮助,如果您有任何疑问,请告诉我们!