Een beginnershandleiding voor Python Tornado

Het web is nu een grote plaats. We moeten duizenden klanten tegelijk ondersteunen, en hier komt Tornado. Tornado is een Python web framework en asynchrone netwerk library, oorspronkelijk ontwikkeld bij FriendFreed.

Tornado maakt gebruik van non-blocking network-io. Hierdoor kan het duizenden actieve server verbindingen aan. Het is een redder in nood voor toepassingen waar lange polling en een groot aantal actieve verbindingen worden onderhouden.

Tornado is niet zoals de meeste Python frameworks. Het is niet gebaseerd op WSGI, hoewel het sommige functies van WSGI ondersteunt met behulp van module `tornado.wsgi`. Het gebruikt een event loop ontwerp dat Tornado verzoeken sneller laat uitvoeren.

Wat is Synchroon Programma?

Een functie blokkeert, voert zijn berekeningen uit, en keert terug, als hij klaar is. Een functie kan om vele redenen blokkeren: netwerk I/O, schijf I/O, mutexes, enz.

De prestaties van een toepassing hangen af van hoe efficiënt de toepassing CPU-cycli gebruikt, daarom moeten blokkeringsverklaringen/aanroepen serieus worden genomen. Denk aan hashing-functies voor wachtwoorden, zoals bcrypt, die per ontwerp honderden milliseconden CPU-tijd gebruiken, veel meer dan een typische netwerk- of schijftoegang. Omdat de CPU niet inactief is, is het niet nodig om voor asynchrone functies te kiezen.

Een functie kan blokkerend zijn in de ene, en niet-blokkerend in de andere. In de context van Tornado beschouwen we over het algemeen blokkeren als gevolg van netwerk I / O en schijf, hoewel alle soorten van blokkeren moeten worden geminimaliseerd.

Wat is asynchroon programma?

1) Single-threaded architectuur:

Betekent, kan het niet doen computation-centric taken parallel.

2) I/O concurrency:

Het kan IO-taken overdragen aan het besturingssysteem en doorgaan naar de volgende taak om parallellisme te bereiken.

3) epoll/ kqueue:

Onderstreept systeem-gerelateerde construct waarmee een toepassing gebeurtenissen op een bestandsdescriptor of I/O-specifieke taken kan krijgen.

4) Event-lus:

Het gebruikt epoll of kqueue om te controleren of een gebeurtenis heeft plaatsgevonden, en voert een callback uit die op die netwerkgebeurtenissen wacht.

Asynchroon vs Synchroon Web Framework:

In het geval van een synchroon model wordt elk verzoek of elke taak doorgegeven aan een thread of routing, en als deze is voltooid, wordt het resultaat overgedragen aan de beller. Hier is het beheer eenvoudig, maar het aanmaken van nieuwe threads brengt te veel overhead met zich mee.

In asynchrone frameworks, zoals Node.js, is er sprake van een single-threaded model, dus minder overhead, maar wel complex.

Stellen we ons eens voor dat er duizenden verzoeken binnenkomen en dat een server gebruikmaakt van een event-lus en callback. Totdat het verzoek is verwerkt, moet de status van het verzoek efficiënt worden opgeslagen en beheerd om het resultaat van de callback naar de daadwerkelijke client te kunnen doorsturen.

Node.js vs Tornado

De meeste van deze vergelijkingspunten hebben betrekking op de programmeertaal en niet op het framework:

  • Node.js heeft een groot voordeel dat al zijn bibliotheken Async zijn. In Python, zijn er veel beschikbare pakketten, maar zeer weinigen van hen zijn asynchroon
  • Als Node.js is JavaScript runtime, en we kunnen JS gebruiken voor zowel front-en back-end, kunnen ontwikkelaars slechts een codebase houden en delen dezelfde utility library
  • Google’s V8-engine maakt Node.js sneller dan Tornado. Maar veel Python bibliotheken zijn geschreven in C en kunnen snellere alternatieven zijn.

Een eenvoudig ‘Hallo Wereld’ voorbeeld

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

Opmerking: dit voorbeeld maakt geen gebruik van asynchrone functies.

Met de module AsyncHTTPClient kunnen we REST-aanroepen asynchroon uitvoeren.

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

Zoals u kunt zien wordt `yield http_client.fetch(url)` als een coroutine uitgevoerd.

Complex voorbeeld van Tornado Async

Kijk eens naar Asynchronous Request handler.

WebSockets met behulp van Tornado:

Tornado heeft een ingebouwd pakket voor WebSockets dat gemakkelijk kan worden gebruikt met coroutines om concurrency te bereiken, hier is een voorbeeld:

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

Een WebSocket-clienttoepassing kan verbinding maken met de server, het bericht kan een geheel getal zijn. Na verwerking ontvangt de client het resultaat als het gehele getal priem is of niet.
Hier is nog een voorbeeld van de werkelijke async functies van Tornado. Velen zullen het vergelijkbaar vinden met Golang’s Goroutine en channels.

In dit voorbeeld kunnen we worker(s) starten en zij zullen luisteren naar de ’tornado.queue’. Deze wachtrij is asynchroon en lijkt erg op het asyncio-pakket.

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

Conclusie

1) Asynchrone frameworks zijn niet erg nuttig wanneer de meeste berekeningen CPU-centrisch zijn en niet I/O.

2) Dankzij een single thread per core-model en event loop, kan het duizenden actieve client-verbindingen beheren.

3) Velen zeggen dat Django te groot is, Flask te klein, en Tornado is precies goed:)

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.