Te veel verzoeken: wat een verzoek kost
Hier bouw je op verder: Modules importeren
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- Python Modules importeren
Je server uit les 1 antwoordt
op GET /. Voor jou is dat één regel in de adresbalk. Voor je server is het werk: het
verzoek komt binnen, FastAPI zoekt welke functie erbij hoort, die functie
draait, en het antwoord gaat terug. Pas daarna is de server klaar met dit
verzoek. Een server heeft dus een grens aan hoeveel verzoeken hij per seconde
aankan. Hoe lang één verzoek duurt, meet je met een script.
Eén verzoek meten
Start je server met fastapi dev main.py. Maak daarnaast een los bestand
meet.py. Het speelt de rol van bezoeker, met httpx, zoals in
Een script als bezoeker.
import httpx
antwoord = httpx.get("http://127.0.0.1:8000/")
print(antwoord.status_code)
print(antwoord.json())
print(round(antwoord.elapsed.total_seconds() * 1000, 1), "milliseconden")
- Regel 3:
httpx.getdoet wat de browser doet als je een adres intypt: eenGET-verzoek sturen en wachten op het antwoord.:8000is de poort vanfastapi dev. - Regel 5-6:
De statuscode en de inhoud van het antwoord. 200 betekent gelukt.
- Regel 7:
elapsedis de tijd tussen versturen en antwoord.total_seconds()geeft seconden; keer duizend zijn het milliseconden, enround(…, 1)houdt één cijfer achter de komma over.
Sla meet.py op. fastapi dev start dan opnieuw, want het ziet een nieuw
.py-bestand in zijn map. Wacht tot in de terminal van je server weer
Application startup complete staat, en draai het script dan in een tweede
terminal.
Een milliseconde is een duizendste van een seconde, dus een paar milliseconden is heel kort.
Wat dat getal betekent
Duurt één antwoord 2 milliseconden, dan kan je server er ongeveer 500 per seconde geven, als ze netjes na elkaar komen. Dat is ruim genoeg voor een klas vol bezoekers. Maar het is geen oneindig getal. Komen er meer verzoeken dan de server kan beantwoorden, dan moeten ze wachten, en wie te lang wacht, krijgt geen antwoord meer.
Een endpoint dat meer doet, bijvoorbeeld alle berichten uit de database halen, kost meer tijd per verzoek. Dan ligt de grens lager.
Er gaat iets mis
Connection refused
httpx.ConnectError: [Errno 111] Connection refused
Oorzaak: je server draait niet. Het script klopt aan op 127.0.0.1:8000,
maar daar luistert niemand. Op Windows en macOS staat er een ander getal of een
andere tekst achter ConnectError, met hetzelfde idee.
Oplossing: start je server in een aparte terminal met
fastapi dev main.py, en draai het script pas als daar
Application startup complete staat.
Honderden milliseconden
Het script print geen paar milliseconden, maar iets als 830.0 milliseconden.
Oorzaak: je draaide het script meteen nadat je het opsloeg. Je server was nog aan het opnieuw starten, en je verzoek wachtte daarop.
Oplossing: wacht tot Application startup complete in de terminal van je
server staat, en draai het script opnieuw. Zie ook
Je server start opnieuw als je een script opslaat.
Opdrachten
Opdracht 1: Predict - Hoeveel per seconde?
Een ander endpoint haalt alle berichten uit het gastenboek. Eén antwoord duurt daar 20 milliseconden.
Vraag: hoeveel verzoeken per seconde kan de server daar ongeveer beantwoorden, als ze na elkaar komen?
Tip
Een seconde is 1000 milliseconden.
Antwoord
Ongeveer 50: 1000 milliseconden gedeeld door 20. Tien keer zo veel werk per verzoek betekent tien keer zo weinig verzoeken per seconde.
Opdracht 2: Run - Drie keer meten
Draai meet.py drie keer achter elkaar. Is de tijd elke keer hetzelfde?
Antwoord
Nee, elke keer een beetje anders, bijvoorbeeld 2,3 en 1,8 en 2,1 milliseconden. Je computer doet ook andere dingen tegelijk, en dat merk je in de laatste cijfers. Sla je tussendoor iets op, dan is de eerste keer daarna veel trager; dat staat bij Er gaat iets mis.
Door naar les 3: zelf twintig verzoeken.