En nybegynderguide til Python Tornado

Nettet er et stort sted nu. Vi skal understøtte tusindvis af klienter ad gangen, og her kommer Tornado. Tornado er en Python-webramme og et asynkront netværksbibliotek, oprindeligt udviklet hos FriendFreed.

Tornado bruger non-blocking network-io. På grund af dette kan det håndtere tusindvis af aktive serverforbindelser. Det er en redning for applikationer, hvor der opretholdes lange afstemninger og et stort antal aktive forbindelser.

Tornado er ikke som de fleste Python-rammer. Det er ikke baseret på WSGI, selv om det understøtter nogle funktioner i WSGI ved hjælp af modulet `tornado.wsgi`. Det bruger et design med en hændelsessløjfe, der gør Tornados anmodningsekvering hurtigere.

Hvad er synkront program?

En funktion blokerer, udfører sin beregning og vender tilbage, når den er færdig . En funktion kan blokere af mange årsager: netværks-I/O, disk-I/O, mutexes osv.

Applikationens ydeevne afhænger af, hvor effektivt applikationen bruger CPU-cyklusser, derfor skal blokerende udsagn/kald tages alvorligt. Tænk på password hashing-funktioner som bcrypt, der designmæssigt bruger hundredvis af millisekunder af CPU-tid, hvilket er langt mere end en typisk netværks- eller diskadgang. Da CPU’en ikke er ubenyttet, er der ingen grund til at gå til asynkrone funktioner.

En funktion kan være blokerende i en og ikke-blokkerende i andre. I forbindelse med Tornado betragter vi generelt blokering på grund af netværks-I/O og disk, selv om alle former for blokering skal minimeres.

Hvad er asynkront program?

1) Single-threaded arkitektur:

Betyder, at det ikke kan udføre beregningscentrerede opgaver parallelt.

2) I/O-konkurrens:

Det kan overdrage IO-opgaver til operativsystemet og fortsætte til den næste opgave for at opnå parallelitet.

3) epoll/ kqueue:

Understreg systemrelateret konstruktion, der gør det muligt for et program at få begivenheder på en fildeskriptor eller I/O-specifikke opgaver.

4) Event loop:

Den bruger epoll eller kqueue til at kontrollere, om der er sket en begivenhed, og udfører callback, der venter på disse netværksbegivenheder.

Asynkron vs. synkron webramme:

I tilfælde af synkron model overføres hver anmodning eller opgave til tråd eller routing, og når den er færdig, overdrages resultatet til den, der kalder. Her er det nemt at administrere tingene, men det er for meget overhead at oprette nye tråde.

På den anden side er der i asynkrone rammer, som Node.js, en single-threaded model, så meget mindre overhead, men det har kompleksitet.

Lad os forestille os tusindvis af anmodninger, der kommer igennem, og en server bruger event loop og callback. Nu, indtil anmodningen bliver behandlet, skal den effektivt gemme og administrere tilstanden af denne anmodning for at mappe callback-resultatet til den faktiske klient.

Node.js vs Tornado

De fleste af disse sammenligningspunkter er bundet til det faktiske programmeringssprog og ikke til rammen:

  • Node.js har en stor fordel, at alle dets biblioteker er Async. I Python er der masser af tilgængelige pakker, men meget få af dem er asynkrone
  • Da Node.js er JavaScript runtime, og vi kan bruge JS til både front- og backend, kan udviklere kun holde én kodebase og dele det samme utility-bibliotek
  • Google’s V8-motor gør Node.js hurtigere end Tornado. Men en masse Python-biblioteker er skrevet i C og kan være hurtigere alternativer.

Et simpelt “Hello World”-eksempel

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

Bemærk: Dette eksempel bruger ikke nogen asynkron funktion.

Med AsyncHTTPClient-modulet kan vi foretage REST-opkald asynkront.

CODE:

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

Som du kan se, vil `yield http_client.fetch(url)` køre som en coroutine.

Komplekst eksempel på Tornado Async

Se venligst på Asynkron Request handler.

WebSockets ved hjælp af Tornado:

Tornado har indbygget pakke til WebSockets, der nemt kan bruges med coroutiner for at opnå samtidighed, her er et eksempel:

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

Man kan bruge et WebSocket-klientprogram til at oprette forbindelse til serveren, meddelelsen kan være et vilkårligt heltal. Efter behandling modtager klienten resultatet, hvis det hele tal er primtal eller ej.
Her er endnu et eksempel på de faktiske asynkrende funktioner i Tornado. Mange vil finde det svarende til Golangs Goroutine og kanaler.

I dette eksempel kan vi starte worker(s), og de vil lytte til ‘tornado.queue’. Denne kø er asynkron og minder meget om asyncio-pakken.

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

Konklusion

1) Asynkrone frameworks er ikke meget værd, når de fleste beregninger er CPU-centrerede og ikke I/O.

2) På grund af en enkelt tråd pr. kerne-model og event loop kan den håndtere tusindvis af aktive klientforbindelser.

3) Mange siger, at Django er for stor, Flask er for lille, og Tornado er lige tilpas:)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.