获取 FastAPI 并行处理请求

Lev*_*evi 6 python python-asyncio fastapi

这是我的小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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

鉴于该函数已被标记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
Run Code Online (Sandbox Code Playgroud)

[对于通话,我刚刚在 localhost:8000/delayed 打开了 2 个浏览器选项卡]

我缺少什么?

jsb*_*eno 6

它按预期并行工作 - 这只是浏览器的事情: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"
}


Run Code Online (Sandbox Code Playgroud)

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

相关问题:向同一资源发出多个请求时 Chrome 会停止?