Un ghid pentru începători pentru Python Tornado

Web-ul este un loc mare acum. Trebuie să susținem mii de clienți în același timp, și iată că apare Tornado. Tornado este un framework web Python și o bibliotecă de rețea asincronă, dezvoltată inițial la FriendFreed.

Tornado folosește o rețea non-blocantă-io. Datorită acestui fapt, poate gestiona mii de conexiuni active la server. Este un salvator pentru aplicațiile în care se mențin interogări lungi și un număr mare de conexiuni active.

Tornado nu este ca majoritatea cadrelor Python. Nu este bazat pe WSGI, deși suportă unele caracteristici ale WSGI folosind modulul `tornado.wsgi`. Folosește un design de buclă de evenimente care face ca execuția cererilor Tornado să fie mai rapidă.

Ce este un program sincron?

O funcție se blochează, își execută calculele și se întoarce, odată terminată . O funcție se poate bloca din mai multe motive: I/O în rețea, I/O pe disc, mutexuri, etc.

Performanța aplicației depinde de cât de eficient utilizează aplicația ciclurile CPU, de aceea declarațiile/apelurile de blocare trebuie luate în serios. Luați în considerare funcțiile de hașurare a parolelor, cum ar fi bcrypt, care prin proiectare utilizează sute de milisecunde de timp CPU, mult mai mult decât un acces tipic la rețea sau la disc. Deoarece CPU-ul nu este inactiv, nu este nevoie să se opteze pentru funcții asincrone.

O funcție poate fi blocantă într-unul, și ne-blocantă în altele. În contextul Tornado, considerăm, în general, blocarea datorată intrărilor/ieșirilor în rețea și pe disc, deși toate tipurile de blocare trebuie să fie minimizate.

Ce este un program asincron?

1) Arhitectura cu un singur fir de execuție:

Înseamnă că nu poate efectua în paralel sarcini centrate pe calcul.

2) Concurența I/O:

Poate transfera sarcinile IO către sistemul de operare și poate continua cu următoarea sarcină pentru a realiza paralelismul.

3) epoll/ kqueue:

Subliniază construcția legată de sistem care permite unei aplicații să obțină evenimente pe un descriptor de fișiere sau sarcini specifice I/O.

4) Bucla de evenimente:

Folosește epoll sau kqueue pentru a verifica dacă s-a întâmplat vreun eveniment și execută callback-ul care așteaptă acele evenimente de rețea.

Cadru web sincron vs sincron:

În cazul modelului sincron, fiecare solicitare sau sarcină este transferată la un fir de execuție sau la o rută și, pe măsură ce se termină, rezultatul este predat apelantului. Aici, gestionarea lucrurilor este ușoară, dar crearea de noi fire de execuție este prea mare.

Pe de altă parte, în cadrul asincron, cum ar fi Node.js, există un model cu un singur fir de execuție, deci foarte puțină suprasolicitare, dar are complexitate.

Să ne imaginăm mii de cereri care vin și un server folosește bucla de evenimente și callback. Acum, până când cererea este procesată, acesta trebuie să stocheze și să gestioneze eficient starea acelei cereri pentru a mapa rezultatul callback-ului către clientul real.

Node.js vs Tornado

Majoritatea acestor puncte de comparație sunt legate de limbajul de programare real și nu de framework:

  • Node.js are un mare avantaj că toate bibliotecile sale sunt Async. În Python, există o mulțime de pachete disponibile, dar foarte puține dintre ele sunt asincrone
  • Pentru că Node.js este un timp de execuție JavaScript și putem folosi JS atât pentru front-end, cât și pentru back-end, dezvoltatorii pot păstra o singură bază de cod și pot împărtăși aceeași bibliotecă utilitară
  • Motorul V8 de la Google face ca Node.js să fie mai rapid decât Tornado. Dar o mulțime de biblioteci Python sunt scrise în C și pot fi alternative mai rapide.

Un exemplu simplu de ‘Hello World’

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

Nota: Acest exemplu nu folosește nici o caracteristică asincronă.

Utilizând modulul AsyncHTTPClient, putem face apeluri REST în mod asincron.

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

Așa cum puteți vedea `yield http_client.fetch(url)` va rula ca o cortină.

Exemplu complex de Tornado Async

Vă rugăm să aruncați o privire la Asynchronous Request handler.

WebSockets folosind Tornado:

Tornado are un pachet încorporat pentru WebSockets care poate fi folosit cu ușurință cu corutine pentru a obține simultaneitate, iată un exemplu:

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

Se poate folosi o aplicație client WebSocket pentru a se conecta la server, mesajul poate fi orice număr întreg. După procesare, clientul primește rezultatul dacă numărul întreg este prim sau nu.
Iată încă un exemplu de caracteristici asincrone reale ale Tornado. Mulți o vor găsi similară cu Goroutine și canalele din Golang.

În acest exemplu, putem porni lucrător(i) și aceștia vor asculta ‘tornado.queue’. Această coadă este asincronă și foarte asemănătoare cu pachetul asyncio.

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

Concluzie

1) Cadrele asincrone nu sunt prea utile atunci când majoritatea calculelor sunt centrate pe CPU și nu pe I/O.

2) Datorită modelului cu un singur fir pe nucleu și a buclei de evenimente, poate gestiona mii de conexiuni active ale clienților.

3) Mulți spun că Django este prea mare, Flask este prea mic, iar Tornado este perfect:)

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.