Aloittelijan opas Python Tornadoon

Netti on nykyään iso paikka. Meidän on tuettava tuhansia asiakkaita kerrallaan, ja tässä tulee Tornado. Tornado on Python-verkkokehys ja asynkroninen verkkokirjasto, joka on alun perin kehitetty FriendFreedissä.

Tornado käyttää lukkiutumatonta verkko-io. Tämän ansiosta se pystyy käsittelemään tuhansia aktiivisia palvelinyhteyksiä. Se on pelastaja sovelluksille, joissa ylläpidetään pitkää kyselyä ja suurta määrää aktiivisia yhteyksiä.

Tornado ei ole kuten useimmat Python-kehykset. Se ei perustu WSGI:hen, vaikka se tukee joitakin WSGI:n ominaisuuksia moduulin `tornado.wsgi` avulla. Se käyttää tapahtumasilmukkasuunnittelua, joka tekee Tornadon pyyntöjen suorittamisesta nopeampaa.

Mikä on synkroninen ohjelma?

Funktio blokkaa, suorittaa laskutoimituksensa ja palaa, kun se on valmis . Funktio voi estyä monista syistä: verkko I/O, levy I/O, mutexit, jne.

Sovelluksen suorituskyky riippuu siitä, kuinka tehokkaasti sovellus käyttää CPU-syklejä, siksi estävät lausekkeet/kutsut on otettava vakavasti. Ajatellaan esimerkiksi bcryptin kaltaisia salasanojen hakkerointifunktioita, jotka käyttävät suunnittelunsa vuoksi satoja millisekunteja CPU-aikaa, paljon enemmän kuin tyypillinen verkko- tai levykäyttö. Koska prosessori ei ole tyhjäkäynnillä, ei ole tarvetta käyttää asynkronisia funktioita.

Funktio voi olla blokkaava yhdessä ja ei-blokkaava toisessa. Tornadon yhteydessä pidämme yleensä verkon I/O:sta ja levystä johtuvaa estoa, vaikka kaikenlainen esto on minimoitava.

Mikä on asynkroninen ohjelma?

1) Yksisäikeinen arkkitehtuuri:

Tarkoittaa, että se ei voi tehdä laskentakeskeisiä tehtäviä rinnakkain.

2) I/O-rinnakkaisuus:

Se voi siirtää IO-tehtävät käyttöjärjestelmälle ja jatkaa seuraavaan tehtävään rinnakkaisuuden saavuttamiseksi.

3) epoll/ kqueue:

Alleviivaa järjestelmään liittyvää konstruktiota, jonka avulla sovellus voi saada tapahtumia tiedoston kuvaajasta tai I/O-kohtaisista tehtävistä.

4) Tapahtumasilmukka:

Se käyttää epoll:ia tai kqueue:a tarkistaakseen, onko jokin tapahtuma tapahtunut, ja suorittaa takaisinsoittoa (callbackia), joka odottaa kyseisiä verkko-tapahtumia.

Asynkroninen vs. synkroninen Web Framework:

Synkronisessa mallissa jokainen pyyntö tai tehtävä siirretään säikeeseen tai reititykseen, ja kun se päättyy, tulos luovutetaan kutsujalle. Tässä asioiden hallinta on helppoa, mutta uusien säikeiden luominen aiheuttaa liikaa ylikuormitusta.

Toisaalta asynkronisessa kehyksessä, kuten Node.js:ssä, on yhden säikeen malli, joten ylikuormitusta on hyvin vähän, mutta siinä on monimutkaisuutta.

Kuvitellaanpa, että pyyntöjä tulee tuhansia ja palvelin käyttää tapahtumasilmukkaa (event loop) ja takaisinkutsua. Nyt, kunnes pyyntöä käsitellään, sen on tallennettava ja hallinnoitava tehokkaasti kyseisen pyynnön tilaa, jotta callback-tulos voidaan liittää varsinaiseen asiakkaaseen.

Node.js vs. Tornado

Molemmat näistä vertailukohteista liittyvät varsinaiseen ohjelmointikieleen eikä kehykseen:

  • Node.js:llä on yksi suuri etu, että kaikki sen kirjastot ovat Async. Pythonissa on paljon saatavilla olevia paketteja, mutta hyvin harvat niistä ovat asynkronisia
  • Koska Node.js on JavaScript-runtime, ja voimme käyttää JS:ää sekä front- että back-endissä, kehittäjät voivat pitää vain yhtä koodipohjaa ja jakaa saman apukirjaston
  • Googlen V8-moottori tekee Node.js:stä nopeamman kuin Tornado. Mutta monet Python-kirjastot on kirjoitettu C-kielellä ja voivat olla nopeampia vaihtoehtoja.

Yksinkertainen ’Hello World’ esimerkki

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

Huomautus: Tässä esimerkissä ei käytetä mitään asynkronista ominaisuutta.

AsyncHTTPClient-moduulin avulla voimme tehdä REST-kutsun asynkronisesti.

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

Kuten näet, `yield http_client.fetch(url)` suoritetaan korutiinina.

Kompleksinen esimerkki Tornadon asynkronisesta

Katsokaa Asynkroninen Request handler.

WebSockets Using Tornado:

Tornadossa on sisäänrakennettu paketti WebSocketsille, jota voidaan helposti käyttää korutiinien kanssa samanaikaisuuden saavuttamiseksi, tässä on yksi esimerkki:

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

Voidaan käyttää WebSocket-asiakassovellusta yhteyden muodostamiseen palvelimeen, viesti voi olla mikä tahansa kokonaisluku. Käsittelyn jälkeen asiakas saa tuloksen, onko kokonaisluku alkuluku vai ei.
Tässä on vielä yksi esimerkki Tornadon todellisista async-ominaisuuksista. Monet pitävät sitä samanlaisena kuin Golangin Goroutinea ja kanavia.

Tässä esimerkissä voimme käynnistää worker(t) ja ne kuuntelevat ’tornado.queue’ta. Tämä jono on asynkroninen ja hyvin samanlainen kuin asyncio-paketti.

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

Johtopäätös

1) Asynkronisista kehyksistä ei ole paljoa hyötyä, kun suurin osa laskennoista on CPU-keskeisiä eikä I/O:ta.

2) Yhden säikeen per ydin -mallin ja tapahtumasilmukan ansiosta se pystyy hallitsemaan tuhansia aktiivisia asiakasyhteyksiä.

3) Moni sanoo, että Django on liian iso, Flask liian pieni ja Tornado taas juuri sopiva:)

Vastaa

Sähköpostiosoitettasi ei julkaista.