Pythonin helppokäyttöisyyden ja monipuolisuuden ansiosta sitä käytetään ohjelmistojen rakentamiseen lähes kaikilla tietotekniikan aloilla. Yksi merkittävä markkinarako on verkkopalvelut, joissa Pythonin kehitysnopeus ja joustavat metaforat helpottavat verkkosivujen nopeaa käyttöönottoa.

Ja kuten arvata saattaa, Python antaa paljon valinnanvaraa ja liikkumavaraa niin pienissä kuin suurissakin web-kehyksissä. Loppujen lopuksi jokaisen web-projektin ei tarvitse olla yrityslaajuinen. Useimpien pitäisi olla juuri tarpeeksi suuria, jotta homma hoituu, eikä suurempia. Tässä artikkelissa tarkastellaan kahdeksaa tunnetuinta Python-kehystä, jotka korostavat yksinkertaisuutta, kevyttä toimitusta ja tiukkaa keskittymistä.

Bottle

Bottlea voisi pitää eräänlaisena mini-Flaskina, sillä se on vielä kompaktimpi ja ytimekkäämpi kuin tuo toinen ”mikrokehys”. Minimijalanjälkensä ansiosta Bottle sopii erinomaisesti sisällytettäväksi muihin projekteihin tai pienten projektien, kuten REST API:iden, nopeaan toimittamiseen. (Flaskia käsitellään jäljempänä.)

Koko Bottlen koodipohja mahtuu yhteen tiedostoon, eikä sillä ole lainkaan ulkoisia riippuvuuksia. Siitä huolimatta Bottle on varustettu riittävällä toiminnallisuudella tavallisten verkkosovellusten rakentamiseen turvautumatta ulkopuoliseen apuun.

Botlen reititysjärjestelmä, joka liittää URL-osoitteet funktioihin, on lähes täsmälleen sama syntaksi kuin Flaskissa. Et myöskään ole rajoittunut kiinteästi kytkettyihin polkuihin, vaan voit luoda niitä dynaamisesti. Pyyntö- ja vastausdataa, evästeitä, kyselymuuttujia, POST-toiminnon lomaketietoja, HTTP-otsakkeita ja tiedostojen latauksia voidaan käyttää ja käsitellä Bottlen objektien avulla.

Jokaista ominaisuutta on toteutettu hyvällä huomiolla. Esimerkiksi tiedostojen lataamisessa tiedostoa ei tarvitse nimetä uudelleen, jos sen nimeämiskäytäntö on ristiriidassa kohdetiedostojärjestelmän kanssa (esimerkiksi vinoviivat nimessä Windowsissa). Bottle voi tehdä sen puolestasi.

Bottle sisältää oman yksinkertaisen HTML-templating-moottorinsa. Vaikka templatointimoottori onkin minimaalinen, siinä on kaikki olennainen. Mallin sisältämät muuttujat renderöidään oletusarvoisesti turvallisella HTML:llä; sinun on ilmoitettava, mitkä muuttujat ovat turvallisia toistettavaksi kirjaimellisesti. Jos haluat mieluummin vaihtaa Bottlen mallinnusmoottorin johonkin toiseen, kuten Jinja2:een, Bottle antaa sinun tehdä sen vaivattomasti. Pidän enemmän Bottlen mukana tulevasta simple-template-järjestelmästä; se on nopea, sen syntaksi on vaatimaton ja sen avulla voit sekoittaa koodia ja template-tekstiä ilman kohtuuttomia vaikeuksia.

Bottle tukee jopa useita palvelinten taustapäätteitä. Sen mukana tulee oma sisäänrakennettu minipalvelin nopeaa testausta varten, mutta se tukee myös yleistä WSGI:tä, monenlaisia WSGI-yhteensopivia HTTP-palvelimia ja tarvittaessa pelkkää vanhaa CGI:tä.

Bottle ei tarvitse yhtä paljon dokumentaatiota kuin muut kehykset, mutta dokumentaatio ei suinkaan ole niukka. Kaikki olennainen mahtuu yhdelle (joskin pitkälle) verkkosivulle. Sen lisäksi löydät täydellisen dokumentaation jokaisesta API:sta, esimerkkejä käyttöönotosta eri infrastruktuureissa, selityksen sisäänrakennetusta templatointikielestä ja joukon yleisiä reseptejä.

Kuten Flaskin kohdalla, voit laajentaa Bottlen toiminnallisuutta manuaalisesti tai lisäosien avulla. Bottle-liitännäisiä ei ole läheskään yhtä paljon kuin Flaskissa, mutta niistä löytyy hyödyllisiä palasia, kuten integrointi eri tietokantakerroksiin ja peruskäyttäjän todennus. Asynkroniseen tukeen Bottle voi käyttää jotakin olemassa olevista palvelinsovittimista, jotka toimivat asynkronisesti, kuten aiohttp/uvloop, mutta async/await ei ole natiivisti tuettu.

Yksi seuraus Bottlen minimalismista on se, että joitain asioita ei yksinkertaisesti ole olemassa. Lomakkeen validointi, mukaan lukien ominaisuudet kuten CSRF (cross-site request forgery) -suojaus, ei ole mukana. Jos haluat rakentaa verkkosovelluksen, joka tukee korkeaa käyttäjävuorovaikutusta, sinun on lisättävä tämä tuki itse.

Toinen ongelma Bottlessa on se, että kehitys on pysähtynyt; viimeinen pisteversio, 0.12, tuli vuonna 2013. Tästä huolimatta Bottlea ylläpidetään edelleen, ja sen kehitysversiot ovat edelleen käyttökelpoisia tuotantoon. Kehittäjät aikovat toimittaa uusia versioita, jotka karistavat tuen vanhoille Python-versioille.

CherryPy

CherryPy on ollut olemassa muodossa tai toisessa jo lähes 20 vuotta, mutta se ei ole menettänyt minimalismia ja eleganssia, jotka erottivat sen alusta alkaen.

CherryPyn tavoitteena on sen lisäksi, että se sisältää vain ne paljaat palaset, joita tarvitaan verkkosivujen palvelemiseen, tuntua mahdollisimman pitkälti siltä, ettei se ole ”web-kehys” vaan aivan kuin mikä tahansa Python-sovellus. Sivustot kuten Hulu ja Netflix ovat käyttäneet CherryPy:tä tuotannossa, koska kehys tarjoaa erittäin huomaamattoman pohjan, jolle rakentaa. CherryPy käyttää konepellin alla poolattuja säikeitä, mitä paremmin se tukee monisäikeisiä palvelinsovittimia.

CherryPyn avulla voit pitää web-sovelluksesi erillään ydinlogiikasta. Jos haluat kartoittaa sovelluksesi toiminnot CherryPyn palvelemiin URL-osoitteisiin tai reitteihin, luot luokan, jonka objektien nimiavaruudet vastaavat suoraan URL-osoitteita, joita haluat palvella. Esimerkiksi verkkosivuston juurta tarjoaa funktio nimeltä ”index”. Näihin funktioihin välitettyjä parametreja käytetään GET- tai POST-menetelmien tarjoamien muuttujien käsittelyyn.

CherryPyn sisältämät bitit on tarkoitettu toimimaan matalan tason rakennuspalikoina. Istuntotunnisteet ja evästeiden käsittely ovat mukana, mutta HTML-templatointi ei. Kuten Bottle, myös CherryPy tarjoaa tavan kartoittaa reittejä levyllä oleviin hakemistoihin staattista tiedostojen tarjoilua varten.

CherryPy viittaa usein olemassa olevaan kolmannen osapuolen kirjastoon tukeakseen ominaisuutta sen sijaan, että se tarjoaisi sen natiivisti. Esimerkiksi WebSocket-sovelluksia CherryPy ei tue suoraan, vaan ws4py-kirjaston kautta.

CherryPyn dokumentaatio sisältää kätevän tutoriaalin, jossa käydään läpi ohjelman eri osa-alueet. Se ei vie sinua läpi täydellistä päästä päähän -sovellusta, toisin kuin jotkut muut kehyksen opetusohjelmat, mutta se on silti hyödyllinen. Asiakirjoissa on käteviä huomautuksia käyttöönotosta virtuaalisissa isännöitsijöissä, käänteisestä välityspalvelimesta Apachen ja Nginxin kautta ja monista muista skenaarioista.

Falcon

Jos rakennat REST-pohjaisia API-rajapintoja etkä mitään muuta, Falcon on tehty juuri sinua varten. Laiha ja nopea, lähes ilman riippuvuuksia standardikirjaston lisäksi, Falcon tarjoaa kaiken, mitä tarvitset REST API-rajapintoihin, eikä mitään muuta. Vuonna 2019 julkaistu Falcon 2.0 luopuu Python 2.x -tuesta ja vaatii vähintään Python 3.5:n.

Suuri osa siitä, miksi Falcon ansaitsee ”kevyt ja hoikka” -merkinnän, ei liity juurikaan kehyksen koodirivien määrään. Se johtuu siitä, että Falcon ei määrää sovelluksille juuri mitään omaa rakennetta. Falcon-sovelluksen tarvitsee vain ilmoittaa, mitkä toiminnot vastaavat mitäkin API-päätteitä. JSON:n palauttaminen päätepisteestä ei vaadi juuri muuta kuin reitin määrittämisen ja tietojen palauttamisen Pythonin standardikirjaston json.dumps-funktion avulla. Tuki asynkille ei ole vielä saapunut Falconiin, mutta työtä tehdään sen toteuttamiseksi Falcon 3.0:ssa.

Falcon käyttää myös järkeviä out-of-the-box oletusasetuksia, joten asennuksessa tarvitaan vain vähän puuhastelua. Esimerkiksi 404-ilmoitukset tulevat oletusarvoisesti kaikille reiteille, joita ei ole nimenomaisesti ilmoitettu. Jos haluat palauttaa virheet asiakkaalle, voit herättää jonkin kehyksen mukana tulevista poikkeuksista (kuten HTTPBadRequest) tai käyttää yleistä falcon.HTTPError-poikkeusta. Jos tarvitset reitin esikäsittelyä tai jälkikäsittelyä, Falcon tarjoaa koukkuja myös niitä varten.

Falconin keskittyminen API-rajapintoihin tarkoittaa, että tässä ei ole juurikaan hyötyä verkkosovellusten rakentamiseen perinteisillä HTML-käyttöliittymillä. Älä odota paljon esimerkiksi lomakkeiden käsittelytoimintoja tai CSRF-suojaustyökaluja. Tästä huolimatta Falcon tarjoaa tyylikkäitä vaihtoehtoja toiminnallisuuden laajentamiseen, joten monimutkaisempia kohteita voidaan rakentaa. Edellä mainitun kytkentämekanismin lisäksi löydät rajapinnan väliohjelmistojen luomiseen, jota voidaan käyttää kaikkien Falconin API:iden käärimiseen.

Falconin dokumentaatio on ohutta verrattuna muihin kehyksiin, mutta vain siksi, että käsiteltävää on vähemmän. Käyttöopas sisältää muodollisen vaiheittaisen läpikäynnin kaikista tärkeimmistä ominaisuuksista sekä pikakäynnistysosion, jonka avulla voit tarkastella esimerkkikoodia merkinnöillä tai ilman niitä.

FastAPI

FastAPIn nimi on hyvä yhteenveto siitä, mitä se tekee. Se on rakennettu luomaan API-päätepisteitä nopeasti, ja se toimii myös nopeasti.

FastAPI käyttää Starlette-projektia sen nopean verkkoytimen ytimenä, mutta sinun ei tarvitse tuntea Starlette-projektin sisäpiiriä käyttääksesi FastAPIa. Määrittelet päätepisteet pitkälti samalla tavalla kuin Flask- tai Bottle-sovelluksessa – käytät sisustajia osoittamaan, mitkä funktiot käsittelevät mitäkin reittejä – ja palautat sitten sanakirjoja, jotka käännetään automaattisesti JSON:ksi.

Voit helposti ohittaa sen, miten asiat palautetaan. Jos esimerkiksi haluat palauttaa HTML/XML:ää joistakin päätepisteistä, voit tehdä sen yksinkertaisesti palauttamalla mukautetun Response-olion. Jos haluat lisätä mukautetun väliohjelmiston, voit lisätä mitä tahansa ASGI-standardin mukaista.

FastAPI käyttää Pythonin tyyppihavainnointia antaakseen rajoituksia sille, millaista dataa reitit hyväksyvät. Jos sinulla on esimerkiksi reitti, jonka tyyppi on Optional, FastAPI hylkää kaikki muut syötteet paitsi kokonaisluvut. Sinun ei tarvitse lisätä tietojen validointikoodia päätepisteisiisi, vaan voit vain käyttää tyyppihuomautuksia ja antaa FastAPIn tehdä työn.

Joitakin asioita on luonnollisesti jätetty pois. Esimerkiksi natiivia HTML-mallinnusmoottoria ei ole, mutta tätä aukkoa täyttäviä kolmannen osapuolen ratkaisuja on runsaasti. Sama koskee tietokantayhteyksiä, mutta dokumentaatio sisältää yksityiskohtia siitä, miten tietyt ORM:t (esim. Peewee) saadaan toimimaan FastAPIn asynkisten käyttäytymismallien kanssa.

Flask

Monet keskustelut Python-verkkokehyksistä alkavat Flaskista, ja hyvästä syystä. Flask on vakiintunut, hyvin ymmärretty kehys, joka on helppokäyttöinen ja melko vakaa. On lähes mahdotonta mennä pieleen, jos Flaskia käytetään kevyeen web-projektiin tai perus-REST-API:hen, mutta jos yrität rakentaa jotain isompaa, edessäsi on raskas taakka.

Flaskin keskeinen vetovoima on sen matala kynnys päästä sisään. Perus ”hello world” -sovellus voidaan luoda alle 10 rivillä Python-kielellä. Flask sisältää laajalti käytetyn HTML-mallinnusjärjestelmän, Jinja2:n, joka tekee tekstin renderöinnistä helppoa, mutta Jinja2:n voi vaihtaa mihin tahansa muuhun mallinnusmoottoriin (kuten Mustache), tai voit luoda oman.

Yksinkertaisuuden nimissä Flask jättää pois hienoudet, kuten datakerroksen tai ORM:n, eikä tarjoa mitään määräyksiä lomakkeiden validointiin. Flaskia voidaan kuitenkin laajentaa laajennuksilla, joita on kymmeniä ja jotka kattavat monia yleisiä käyttötapauksia, kuten välimuistitallennuksen, lomakkeiden käsittelyn ja validoinnin sekä tietokantayhteyden. Tämä lean-by-default-suunnittelu antaa sinulle mahdollisuuden aloittaa Flask-sovelluksen suunnittelun absoluuttisella minimitoiminnallisuudella ja lisätä sitten vain tarvitsemasi palat, kun tarvitset niitä.

Flaskin dokumentaatio on nerokasta ja helppolukuista. Pikakäynnistys-dokumentti tekee erinomaista työtä aloituksessa ja selittää samalla oletusvalintojen merkityksen yksinkertaiselle Flask-sovellukselle, ja API-dokumentit ovat täynnä hyviä esimerkkejä. Erinomainen on myös kokoelma Flask-snippettejä, jotka ovat pikaisia esimerkkejä siitä, miten suorittaa tiettyjä tehtäviä, kuten miten palauttaa objekti, jos se on olemassa, tai 404-virhe, jos sitä ei ole.

Flask saavutti virstanpylväänsä 1.0-julkaisun vuonna 2018, jolloin Python 2.6 ja Python 3.3 ovat tuetut vähimmäisversiot ja monet sen käyttäytymismalleista ovat vihdoin kiveen hakattuja. Flask ei yksiselitteisesti tue Pythonin asynk-syntaksia, mutta Flaskin API-yhteensopiva variaatio nimeltä Quart on kehitetty täyttämään tätä vaatimusta.

Pyramid

Pieni ja kevyt Pyramid sopii hyvin tehtäviin, kuten olemassa olevan Python-koodin paljastamiseen REST-API:ksi tai web-projektin ytimen tarjoamiseen, jossa kehittäjä tekee suurimman osan raskaista töistä.

”Pyramidin avulla pääset nopeasti tuottavaksi, ja se kasvaa kanssasi”, sanotaan dokumentaatiossa. ”Se ei pidättele sinua, kun sovelluksesi on pieni, eikä se ole tielläsi, kun sovelluksestasi tulee suuri.”

Hyvä tapa kuvata Pyramidin minimalismia olisi ”vapaa politiikasta”, termi, jota käytetään dokumentaation osassa, jossa käsitellään Pyramidin asemaa muihin web-kehyksiin verrattuna. Periaatteessa ”vapaa politiikasta” tarkoittaa sitä, että Pyramid ei välitä siitä, mitä tietokantaa tai templatointikieltä päätät käyttää.

Pyramidin perussovelluksen rakentaminen vaatii hyvin vähän työtä. Kuten Bottle ja Flask, Pyramid-sovellus voi koostua yhdestä ainoasta Python-tiedostosta, lukuun ottamatta itse kehyksen tiedostoja. Yksinkertainen yhden reitin API ei vaadi enempää kuin kymmenkunta riviä koodia. Suurin osa siitä on boilerplatea, kuten from … import-lausekkeita ja WSGI-palvelimen määrittelyä.

Oletusarvoisesti Pyramid sisältää useita web-sovelluksissa yleisiä elementtejä, mutta ne tarjotaan komponentteina, jotka voidaan yhdistää toisiinsa, ei täysimittaisina ratkaisuina. Esimerkiksi käyttäjäistuntojen tuki sisältää jopa CSRF-suojauksen. Käyttäjätilien tuki, kuten kirjautuminen tai tilinhallinta, ei kuitenkaan ole osa sopimusta. Sinun on kehitettävä se itse tai lisättävä se lisäosan avulla. Sama pätee lomakkeiden käsittelyyn ja tietokantayhteyksiin.

Pyramid tarjoaa jopa tavan luoda malleja aiemmista Pyramid-projekteista, jotta aiempaa työtä voidaan käyttää uudelleen. Nämä mallit, joita kutsutaan ”rakennustelineiksi”, luovat Pyramid-sovelluksen, jossa on yksinkertainen reititys ja joitain HTML/CSS-aloitusmalleja. Mukana oleviin telineisiin kuuluu esimerkkilähtöprojekti ja projekti, joka muodostaa yhteyden tietokantoihin suositun Python-kirjaston SQLAlchemyn avulla.

Pyramidin ohuet testaus- ja virheenkorjaustyökalut tekevät tehtävänsä. Kun niputat debugtoolbar-laajennuksen Pyramid-sovellukseen, saat jokaiselle verkkosivulle napsautettavan kuvakkeen, joka tuottaa yksityiskohtaisia tietoja sovelluksen suorituksesta, mukaan lukien yksityiskohtaisen jäljityksen virheiden sattuessa. Myös lokitus ja yksikkötestaus ovat mukana.

Pyramidin dokumentaatio on erinomainen. Perusasioiden pikakierroksen ja tutorial-tyylisen läpikäynnin lisäksi löydät joukon yhteisön tuottamia opetusohjelmia ja keittokirjan yleisistä resepteistä. Jälkimmäinen sisältää käyttöönottotekniikoita lukuisille kohdeympäristöille Google App Enginestä Nginxiin.

Pyramid tukee sekä Python 2:ta että Python 3:aa, mutta ei käytä Python 3:n asynkistä syntaksia. Jos haluat hyödyntää asynkkausta Pyramidissa, tutustu aiopyramid-projektiin, joka sisältää telineen asynkkausta käyttävälle ”hello world” -sovellukselle.

Sanic

Nopeuteen ja yksinkertaisuuteen suunniteltu Sanic toimii Python 3.6:lla tai uudemmalla Pythonilla ja käyttää Pythonin async/await-syntaksia (saatavilla Python 3.5:stä lähtien), jonka avulla voit luoda tehokkaita web-sovelluksia.

Kuten Flaskissa tai Bottlessa, Sanicin ”hello world” -perusversio sisältää noin 10 riviä koodia, josta suurin osa on importteja ja muuta boilerplatea. Tärkein ero on se, että sovellusreitit on ilmoitettava async def-funktioina, ja sinun on käytettävä await-funktioita kutsuaksesi näitä funktioita asynkronisessa koodissasi. Jos olet kirjoittanut asynkronisia sovelluksia aiemminkin, sinulla on vaikein osa jo hallussasi.

Monet mekanismit, joita Sanic käyttää yhteyksien ja vastausten käsittelyyn, ovat tuttuja. Pyynnöt ja vastaukset ovat vain objekteja, joilla on tutun näköisiä ominaisuuksia, kuten ladattuja tiedostoja, lomakkeita, JSON-objekteja, otsikoita ja niin edelleen.

Sovelluksista, joissa on monia reittejä, tulee hankalia hallita. Sanic puuttuu tähän ”blueprinteillä”, objekteilla, jotka voivat kuvata reittien ryhmiä ja joiden avulla niitä voi hallita korkean tason käyttöliittymän kautta. Sen sijaan, että kirjoittaisit jokaisen reitin eksplisiittisesti tai käyttäisit liikaa reittejä muuttujineen, voit kirjoittaa muutaman blueprintin kuvaamaan yleisesti, miten reitit toimivat sovelluksessasi (esim. /object/object_id/action). Blueprinteillä voi olla yhteisiä väliohjelmistoja, mikä on hyödyllistä, jos haluat soveltaa hallintatoimintoja joihinkin reitteihin mutta et toisiin.

Sanic toimii myös muiden protokollien kuin HTTP:n kanssa. WebSocket-päätepisteet vaativat vain erilaisen sisustajan ja hieman enemmän sisäistä logiikkaa (esim. vastausten odottaminen ja käsittely). Mukautettuja verkkoprotokollia voidaan tukea aliluokittelemalla asyncio.protocol.

Sanic jättää tarkoituksella pois toiminnallisuudet, kuten tietokantayhteydet ja HTML-templatoinnin, mutta säilyttää ominaisuudet, joita käytettäisiin näiden ominaisuuksien liittämiseen: väliohjelmistot, keskitetty sovelluksen konfigurointi ja niin edelleen.

Tornado

Tornado on toinen pieni kehys, joka on suunnattu tiettyyn käyttötapaukseen: asynkronisiin verkko-ohjelmiin. Tornado soveltuu hyvin sellaisten palveluiden luomiseen, jotka avaavat paljon verkkoyhteyksiä ja pitävät niitä elossa – eli kaikkeen, mikä sisältää WebSocketsia tai pitkää kyselyä. Tornado 6.0 vaatii Python 3.5:n tai uudemman version ja luopuu kokonaan Python 2 -tuesta.

Kuten Bottle tai Falcon, Tornado jättää pois keskeisen tarkoituksensa kannalta tarpeettomat ominaisuudet. Tornadossa on sisäänrakennettu templating-järjestelmä HTML:n ja muiden tulosteiden tuottamiseen, ja se tarjoaa mekanismeja kansainvälistämiseen, lomakkeiden käsittelyyn, evästeiden asettamiseen, käyttäjän todennukseen ja CSRF-suojaukseen. Se jättää kuitenkin pois ominaisuuksia, kuten lomakkeiden validoinnin ja ORM:n, jotka on tarkoitettu lähinnä käyttäjälle suunnattuihin verkkosovelluksiin.

Tornado on erinomainen tarjoamaan infrastruktuuria sovelluksille, jotka tarvitsevat tarkkaa hallintaa asynkronisesta verkkoyhteydestä. Tornado tarjoaa esimerkiksi sisäänrakennetun asynkronisen HTTP-palvelimen lisäksi myös asynkronisen HTTP-asiakkaan. Näin ollen Tornado soveltuu hyvin sellaisten sovellusten, kuten web scraperin tai botin, rakentamiseen, jotka kyselevät muilta sivustoilta rinnakkain ja toimivat palautettujen tietojen perusteella.

Jos haluat luoda sovelluksen, joka käyttää muita protokollia kuin HTTP:tä, Tornado auttaa sinua. Tornado tarjoaa pääsyn matalan tason TCP-yhteyksiin ja pistorasioihin apuohjelmille, kuten DNS-resolverille, sekä kolmannen osapuolen todennuspalveluille, ja se tukee yhteentoimivuutta muiden kehysten kanssa WSGI-standardin avulla. Dokumentaatio, joka on pieni mutta ei niukka, sisältää runsaasti esimerkkejä kaiken tämän toteuttamiseen.

Tornado sekä hyödyntää että täydentää Pythonin natiivia toiminnallisuutta asynkronista käyttäytymistä varten. Jos käytät Python 3.5:tä, Tornado tukee sisäänrakennettuja async– ja await-avainsanoja, joiden luvataan lisäävän sovellusten nopeutta. Voit myös käyttää futuureja tai takaisinkutsuja käsittelemään vastauksia tapahtumiin.

Tornado tarjoaa kirjaston synkronointiprimitiivejä – semaforit, lukot ja niin edelleen – tapahtumien koordinoimiseksi asynkronisten korutiinien välillä. Huomaa, että Tornado toimii normaalisti yksisäikeisenä, joten nämä primitiivit eivät ole samoja kuin niiden säikeistetyt nimikappaleet. Jos kuitenkin haluat ajaa Tornadoa rinnakkaisissa prosesseissa useiden socketien ja ytimien hyödyntämiseksi, siihen on saatavilla työkaluja.

Tornadon dokumentaatio kattaa jokaisen tärkeimmän käsitteen kehyksessä ja kaikki mallin tärkeimmät API:t. Vaikka se sisältää esimerkkisovelluksen (web crawler), se on lähinnä Tornadon jonotusmoduulin esittelyä varten.

Vastaa

Sähköpostiosoitettasi ei julkaista.