获取 FastAPI 以并行处理请求

Get FastAPI to handle requests in parallel

这是我的琐碎 fastapi 应用程序:

from datetime import datetime
import asyncio

import uvicorn
from fastapi import FastAPI


app = FastAPI()

@app.get("/delayed")
async def get_delayed():
    started = datetime.now()
    print(f"Starting at: {started}")
    await asyncio.sleep(10)
    ended = datetime.now()
    print(f"Ending at: {ended}")
    return {"started": f"{started}", "ended": f"{ended}"}

if __name__ == "__main__":
    uvicorn.run("fastapitest.main:app", host="0.0.0.0", port=8000, reload=True, workers=2)

当我连续两次调用它时,第二个函数中的代码直到第一个请求完成后才开始执行,产生如下输出:

Starting at: 2021-09-17 14:52:40.317915
Ending at: 2021-09-17 14:52:50.321557
INFO:     127.0.0.1:58539 - "GET /delayed HTTP/1.1" 200 OK
Starting at: 2021-09-17 14:52:50.328359
Ending at: 2021-09-17 14:53:00.333032
INFO:     127.0.0.1:58539 - "GET /delayed HTTP/1.1" 200 OK

鉴于函数标记为 async 而我正在 awaiting sleep,我希望得到不同的输出,例如:

Starting at: ...
Starting at: ...
Ending at: ...
INFO:     127.0.0.1:58539 - "GET /delayed HTTP/1.1" 200 OK
Ending at: ...
INFO:     127.0.0.1:58539 - "GET /delayed HTTP/1.1" 200 OK

[来电 我刚刚在 localhost:8000/delayed ]

打开了 2 个浏览器标签

我错过了什么?

它按预期并行工作 - 这只是浏览器的事情:chrome 在检测到不同选项卡中请求的相同端点时,将等待第一个被完全解析以检查结果是否可以被缓存。

如果您在 shell 中放置来自不同进程的 3 个 http 请求,结果如预期的那样:

content-length: 77
content-type: application/json
date: Fri, 17 Sep 2021 19:51:39 GMT
server: uvicorn

{
    "ended": "2021-09-17 16:51:49.956629",
    "started": "2021-09-17 16:51:39.955487"
}


HTTP/1.1 200 OK
content-length: 77
content-type: application/json
date: Fri, 17 Sep 2021 19:51:39 GMT
server: uvicorn

{
    "ended": "2021-09-17 16:51:49.961173",
    "started": "2021-09-17 16:51:39.960850"
}


HTTP/1.1 200 OK
content-length: 77
content-type: application/json
date: Fri, 17 Sep 2021 19:51:39 GMT
server: uvicorn

{
    "ended": "2021-09-17 16:51:49.964156",
    "started": "2021-09-17 16:51:39.963510"
}


在每个浏览器选项卡的 URL 上添加一个随机的(即使未使用)查询参数将全部取消尝试缓存行为。

相关问题:Chrome stalls when making multiple requests to same resource?