En nybörjarguide till Python Tornado

Nätet är stort nu. Vi måste stödja tusentals klienter samtidigt, och här kommer Tornado. Tornado är ett webbramverk i Python och ett asynkront nätverksbibliotek som ursprungligen utvecklades på FriendFreed.

Tornado använder icke-blockerande nätverk-io. På grund av detta kan det hantera tusentals aktiva serveranslutningar. Det är en räddare i nöden för tillämpningar där långa omröstningar och ett stort antal aktiva anslutningar upprätthålls.

Tornado är inte som de flesta Pythonramverk. Den är inte baserad på WSGI, även om den stöder vissa funktioner av WSGI med hjälp av modulen `tornado.wsgi`. Den använder en design med en händelseslinga som gör att Tornado-förfrågningar exekveras snabbare.

Vad är ett synkront program?

En funktion blockerar, utför sin beräkning och returnerar när den är klar . En funktion kan blockeras av många anledningar: nätverks-I/O, disk-I/O, mutexes etc.

Programprestanda beror på hur effektivt programmet använder CPU-cykler, därför måste blockerande uttalanden/anrop tas på allvar. Tänk på lösenordshashfunktioner som bcrypt, som till sin konstruktion använder hundratals millisekunder av CPU-tid, mycket mer än en typisk nätverks- eller diskåtkomst. Eftersom CPU:n inte är inaktiv finns det ingen anledning att välja asynkrona funktioner.

En funktion kan vara blockerande i en, och icke-blockerande i andra. I samband med Tornado betraktar vi i allmänhet blockering på grund av nätverks-I/O och disk, även om alla typer av blockering måste minimeras.

Vad är ett asynkront program?

1) Entrådig arkitektur:

Innebär att den inte kan utföra beräkningscentrerade uppgifter parallellt.

2) I/O-konkurrens:

Den kan överlämna IO-uppgifter till operativsystemet och fortsätta till nästa uppgift för att uppnå parallellitet.

3) epoll/ kqueue:

Understryk systemrelaterad konstruktion som gör det möjligt för ett program att få händelser på en filbeskrivare eller I/O-specifika uppgifter.

4) Händelseslinga:

Den använder epoll eller kqueue för att kontrollera om någon händelse har inträffat, och utför callback som väntar på dessa nätverkshändelser.

Synkron vs. synkron webbram:

I fallet med den synkrona modellen överförs varje begäran eller uppgift till en tråd eller routing, och när den är klar överlämnas resultatet till den som ringer. Här är det lätt att hantera saker och ting, men att skapa nya trådar är för mycket overhead.

Å andra sidan, i asynkrona ramverk, som Node.js, finns det en enkeltrådsmodell, så mycket mindre overhead, men det har komplexitet.

Låt oss föreställa oss tusentals förfrågningar som kommer igenom och en server använder händelseslinga och callback. Fram till dess att begäran behandlas måste den effektivt lagra och hantera tillståndet för den begäran för att mappa callback-resultatet till den faktiska klienten.

Node.js vs Tornado

De flesta av dessa jämförelsepunkter är knutna till det faktiska programmeringsspråket och inte till ramverket:

  • Node.js har den stora fördelen att alla dess bibliotek är asynkrona. I Python finns det många tillgängliga paket, men väldigt få av dem är asynkrona
  • Då Node.js är en JavaScript-körningstid och vi kan använda JS för både front- och backend, kan utvecklare behålla endast en kodbas och dela samma verktygsbibliotek
  • Googles V8-motor gör Node.js snabbare än Tornado. Men många Pythonbibliotek är skrivna i C och kan vara snabbare alternativ.

Ett enkelt ”Hello World”-exempel

CODE: https://gist.github.com/velotiotech/b4d91554b739f2487bf6131ac65ec06d.js

Notera: Det här exemplet använder inte någon asynkron funktion.

Med hjälp av modulen AsyncHTTPClient kan vi göra REST-anrop asynkront.

CODE: https://gist.github.com/velotiotech/5fe63eb5fd6cf3af9bf353c2fd3b4ca7.js

Som du kan se kommer `yield http_client.fetch(url)` att köras som en coroutine.

Komplext exempel på Tornado Async

Vänligen ta en titt på Asynchronous Request handler.

WebSockets med Tornado:

Tornado har ett inbyggt paket för WebSockets som enkelt kan användas med coroutiner för att uppnå samtidighet, här är ett exempel:

CODE: https://gist.github.com/velotiotech/34d0a0e0ecd57818ae1db1697c075777.js

Man kan använda ett WebSocket-klientprogram för att ansluta till servern, meddelandet kan vara vilket heltal som helst. Efter bearbetning får klienten resultatet om heltalet är primtal eller inte.
Här är ytterligare ett exempel på faktiska asynkrona funktioner i Tornado. Många kommer att tycka att det liknar Golangs Goroutine och kanaler.

I det här exemplet kan vi starta worker(s) och de kommer att lyssna på ”tornado.queue”. Denna kö är asynkron och påminner mycket om asynciopaketet.

CODE: https://gist.github.com/velotiotech/1477131948ca23879167df0281726d02.js

Slutsats

1) Asynkrona ramverk är inte särskilt användbara när de flesta beräkningar är CPU-centrerade och inte I/O.

2) På grund av en enda tråd per kärnmodell och händelseslinga kan den hantera tusentals aktiva klientanslutningar.

3) Många säger att Django är för stor, Flask är för liten, och Tornado är precis rätt:)

Lämna ett svar

Din e-postadress kommer inte publiceras.