使用 Gunicorn 服务器的 FastApi 中的并发请求结果混淆
Results Are Getting Mixed Up For Concurrent Requests in FastApi Using Gunicorn Server
根据线程标题,给出以下 API:
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=['*'],
allow_headers=['*'],
)
app.mount("/app/static", StaticFiles(directory="app/static"), name="static")
@app.post("/")
async def get_text(image: UploadFile = File(...)):
temp_file = _save_file_to_disk(image, path="app/static/", save_as="temp")
text = await ocr(temp_file)
return {"text": text}
和以下 Gunicorn 命令启动应用程序:
CMD ["gunicorn", "app:app", "-w", "4", "--threads", "12", "--timeout", "120",
"--bind", "0.0.0.0:8080", "-k","uvicorn.workers.UvicornWorker", "--worker-connections", "1000"]
如果 3 个不同的用户同时发送了 3 个单独的请求,第一个用户的结果将超过第二个用户的结果,并且第三个用户
虽然您在问题中缺少相关上下文,但我将尝试猜测:
temp_file = _save_file_to_disk(image, path="app/static/", save_as="temp")
这似乎是将上传的文件保存为 temp
下的 app/static
。然后你 运行 ocr
在这个文件上。
text = await ocr(temp_file)
但是 - 所有三个进程的文件名都相同,这意味着最后一个请求将用请求三的内容覆盖该文件。每个进程都会开始他们的ocr-ing,但是文件已经在进程下被更改了。
而是为每个文件使用唯一的名称 - 您可能还应该将其保留在直接通过 static
.
提供的任何内容之外
根据线程标题,给出以下 API:
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=['*'],
allow_headers=['*'],
)
app.mount("/app/static", StaticFiles(directory="app/static"), name="static")
@app.post("/")
async def get_text(image: UploadFile = File(...)):
temp_file = _save_file_to_disk(image, path="app/static/", save_as="temp")
text = await ocr(temp_file)
return {"text": text}
和以下 Gunicorn 命令启动应用程序:
CMD ["gunicorn", "app:app", "-w", "4", "--threads", "12", "--timeout", "120",
"--bind", "0.0.0.0:8080", "-k","uvicorn.workers.UvicornWorker", "--worker-connections", "1000"]
如果 3 个不同的用户同时发送了 3 个单独的请求,第一个用户的结果将超过第二个用户的结果,并且第三个用户
虽然您在问题中缺少相关上下文,但我将尝试猜测:
temp_file = _save_file_to_disk(image, path="app/static/", save_as="temp")
这似乎是将上传的文件保存为 temp
下的 app/static
。然后你 运行 ocr
在这个文件上。
text = await ocr(temp_file)
但是 - 所有三个进程的文件名都相同,这意味着最后一个请求将用请求三的内容覆盖该文件。每个进程都会开始他们的ocr-ing,但是文件已经在进程下被更改了。
而是为每个文件使用唯一的名称 - 您可能还应该将其保留在直接通过 static
.