我有一个示例 FastAPI 应用程序,其中一个端点在延迟 5 秒后返回结果 a。 请找到下面的代码。
from fastapi import FastAPI
import uvicorn, os
app = FastAPI()
@app.get("/delayed-response")
async def read_root():
time.sleep(5)
return {"message": f"This is a delayed response!- {os.getpid()}"}
if __name__ == "__main__":
uvicorn.run(
"main:app",
host='127.0.0.1',
port=9090,
reload=False,
workers=10, #Just having 10 workers to understand the concept.
)
现在我还有一个脚本,它将向端点发送并行请求
http://localhost:9090/delayed-response
启动应用程序后,我发现进程 ID 从 9 到 18 的所有 10 个工作进程都已成功启动。
当我向此端点发送 20 个并行请求时,我观察到只有前几个请求由工作人员并行处理,后来只有一个工作人员处理所有剩余的请求。 (可能是从某个点开始)。 附上一些响应的屏幕截图:-
任何人都可以解释这种行为吗?
注意:让我们将此应用程序视为同步应用程序。我知道要以并发方式工作的概念很少,但此时我希望了解这种工作方式。
我的期望:我的期望是,当配置 10 个工作线程并并行发送 30 个请求时,对延迟 5 秒的端点的第 30 个请求应该在第 15 到 17 秒左右得到响应。
当大量请求的速度超过工作人员处理能力时,某些请求可能需要排队等待。这种等待可能是由于资源不足或尝试同时使用相同资源的请求过多等原因造成的。在您的情况下,由于您的应用程序一个接一个地处理请求,因此可能会发生这种等待,因为每个请求都需要时间才能完成,然后下一个请求才能开始。因此,如果同时收到太多请求,它们就会开始堆积,最终只剩下一名工作人员来处理所有请求。