by Anonymous » 22 Aug 2025, 10:07
Ich habe eine Fastapi -App geschrieben. Und jetzt denke ich darüber nach, es einzusetzen, aber ich scheine seltsame unerwartete Leistungsprobleme zu bekommen, die davon abhängen, ob ich Uvicorn gegen Gunicorn verwende. Insbesondere der gesamte Code (sogar die Standardbibliothek reiner Python -Code) scheint langsamer zu werden, wenn ich Gunicorn verwende. Für Performance -Debugging habe ich eine kleine App geschrieben, die dies demonstriert: < /p>
Code: Select all
import asyncio, time
from fastapi import FastAPI, Path
from datetime import datetime
app = FastAPI()
@app.get("/delay/{delay1}/{delay2}")
async def get_delay(
delay1: float = Path(..., title="Nonblocking time taken to respond"),
delay2: float = Path(..., title="Blocking time taken to respond"),
):
total_start_time = datetime.now()
times = []
for i in range(100):
start_time = datetime.now()
await asyncio.sleep(delay1)
time.sleep(delay2)
times.append(str(datetime.now()-start_time))
return {"delays":[delay1,delay2],"total_time_taken":str(datetime.now()-total_start_time),"times":times}
< /code>
Ausführen der Fastapi -Appi mit: < /p>
gunicorn api.performance_test:app -b localhost:8001 -k uvicorn.workers.UvicornWorker --workers 1
Der Resonok -Körper von A Get to http: // localhost: 8001/delay/0.0/0.0 ist konsequent so etwas wie:
Code: Select all
{
"delays": [
0.0,
0.0
],
"total_time_taken": "0:00:00.057946",
"times": [
"0:00:00.000323",
...smilar values omitted for brevity...
"0:00:00.000274"
]
}
< /code>
jedoch mit: < /p>
uvicorn api.performance_test:app --port 8001
< /code>
Ich erhalte rund umsahe Zeiten wie diese < /p>
{
"delays": [
0.0,
0.0
],
"total_time_taken": "0:00:00.002630",
"times": [
"0:00:00.000037",
...snip...
"0:00:00.000020"
]
}
Der Unterschied wird noch stärker, wenn ich auf das Asyncio -Sleep (Delay1) Anweisung wartet. Python 3.8.2 unter OS X 11.2.3 mit einem Intel i7 -Prozessor.
Code: Select all
fastapi==0.65.1
gunicorn==20.1.0
uvicorn==0.13.4
Ich habe eine Fastapi -App geschrieben. Und jetzt denke ich darüber nach, es einzusetzen, aber ich scheine seltsame unerwartete Leistungsprobleme zu bekommen, die davon abhängen, ob ich Uvicorn gegen Gunicorn verwende. Insbesondere der gesamte Code (sogar die Standardbibliothek reiner Python -Code) scheint langsamer zu werden, wenn ich Gunicorn verwende. Für Performance -Debugging habe ich eine kleine App geschrieben, die dies demonstriert: < /p>
[code]import asyncio, time
from fastapi import FastAPI, Path
from datetime import datetime
app = FastAPI()
@app.get("/delay/{delay1}/{delay2}")
async def get_delay(
delay1: float = Path(..., title="Nonblocking time taken to respond"),
delay2: float = Path(..., title="Blocking time taken to respond"),
):
total_start_time = datetime.now()
times = []
for i in range(100):
start_time = datetime.now()
await asyncio.sleep(delay1)
time.sleep(delay2)
times.append(str(datetime.now()-start_time))
return {"delays":[delay1,delay2],"total_time_taken":str(datetime.now()-total_start_time),"times":times}
< /code>
Ausführen der Fastapi -Appi mit: < /p>
gunicorn api.performance_test:app -b localhost:8001 -k uvicorn.workers.UvicornWorker --workers 1
[/code]
Der Resonok -Körper von A Get to http: // localhost: 8001/delay/0.0/0.0 ist konsequent so etwas wie:
[code]{
"delays": [
0.0,
0.0
],
"total_time_taken": "0:00:00.057946",
"times": [
"0:00:00.000323",
...smilar values omitted for brevity...
"0:00:00.000274"
]
}
< /code>
jedoch mit: < /p>
uvicorn api.performance_test:app --port 8001
< /code>
Ich erhalte rund umsahe Zeiten wie diese < /p>
{
"delays": [
0.0,
0.0
],
"total_time_taken": "0:00:00.002630",
"times": [
"0:00:00.000037",
...snip...
"0:00:00.000020"
]
}
[/code]
Der Unterschied wird noch stärker, wenn ich auf das Asyncio -Sleep (Delay1) Anweisung wartet. Python 3.8.2 unter OS X 11.2.3 mit einem Intel i7 -Prozessor.[code]fastapi==0.65.1
gunicorn==20.1.0
uvicorn==0.13.4
[/code]