Web je dnes velké místo. Potřebujeme podporovat tisíce klientů najednou, a proto přichází Tornado. Tornado je webový framework a asynchronní síťová knihovna v jazyce Python, původně vyvinutá ve společnosti FriendFreed.
Tornado používá neblokující síť-io. Díky tomu zvládne tisíce aktivních připojení k serveru. Je záchranou pro aplikace, kde se udržuje dlouhé dotazování a velký počet aktivních spojení.
Tornado není jako většina frameworků Pythonu. Není založeno na WSGI, i když některé vlastnosti WSGI podporuje pomocí modulu `tornado.wsgi`. Používá návrh smyčky událostí, díky kterému je provádění požadavků Tornado rychlejší.
Co je to synchronní program?
Funkce se zablokuje, provede svůj výpočet a po dokončení se vrátí . Funkce může blokovat z mnoha důvodů: síťový I/O, diskový I/O, mutexy atd.
Výkon aplikace závisí na tom, jak efektivně aplikace využívá cykly procesoru, proto je třeba brát blokovací příkazy/vyvolání vážně. Vezměme v úvahu funkce pro hašování hesel, jako je bcrypt, které ze své podstaty využívají stovky milisekund procesorového času, což je mnohem více než typický síťový nebo diskový přístup. Protože procesor není nečinný, není třeba přecházet na asynchronní funkce.
Funkce může být v jednom případě blokující a v jiném neblokovaná. V kontextu Tornáda obecně uvažujeme o blokování kvůli síťovým I/O a disku, i když všechny druhy blokování je třeba minimalizovat.
Co je to asynchronní program?
1) Jednovláknová architektura:
To znamená, že nemůže paralelně provádět úlohy zaměřené na výpočet.
2) I/O souběžnost:
Může předávat IO úlohy operačnímu systému a pokračovat v další úloze, aby dosáhl paralelismu.
3) epoll/ kqueue:
Podtrhněte konstrukci související se systémem, která umožňuje aplikaci získávat události na deskriptoru souboru nebo specifické I/O úlohy.
4) Smyčka událostí:
Používá epoll nebo kqueue ke kontrole, zda došlo k nějaké události, a provádí zpětné volání, které na tyto síťové události čeká.
Asynchronní vs. synchronní webový rámec:
V případě synchronního modelu je každý požadavek nebo úloha předána vláknu nebo směrování, a jakmile skončí, výsledek je předán volajícímu. Zde je správa věcí snadná, ale vytváření nových vláken je příliš velká režie.
Na druhou stranu v asynchronním frameworku, jako je Node.js, je jednovláknový model, takže velmi menší režie, ale má složitost.
Představme si, že přicházejí tisíce požadavků a server používá smyčku událostí a zpětné volání. Nyní, dokud není požadavek zpracován, musí efektivně ukládat a spravovat stav tohoto požadavku, aby mohl mapovat výsledek callbacku na aktuálního klienta.
Node.js vs Tornado
Většina těchto srovnávacích bodů je vázána na aktuální programovací jazyk, nikoli na framework:
- Node.js má jednu velkou výhodu, že všechny jeho knihovny jsou asynchronní. V Pythonu je k dispozici spousta balíčků, ale jen málo z nich je asynchronních
- Jelikož Node.js je běhové prostředí JavaScriptu a JS můžeme používat jak pro front-end, tak pro back-end, mohou vývojáři udržovat jen jednu kódovou základnu a sdílet stejnou obslužnou knihovnu
- Jádro V8 od Googlu dělá Node.js rychlejší než Tornado. Ale spousta knihoven Pythonu je napsána v jazyce C a může být rychlejší alternativou.
Jednoduchý příklad ‚Hello World‘
Kód: https://gist.github.com/velotiotech/b4d91554b739f2487bf6131ac65ec06d.js
Poznámka: Tento příklad nepoužívá žádnou asynchronní funkci.
Pomocí modulu AsyncHTTPClient můžeme volání REST provádět asynchronně.
CODE: https://gist.github.com/velotiotech/5fe63eb5fd6cf3af9bf353c2fd3b4ca7.js
Jak vidíte, `yield http_client.fetch(url)` se spustí jako coroutine.
Komplexní příklad Tornado Async
Prosím, podívejte se na obsluhu asynchronních požadavků.
WebSockets pomocí Tornada:
Tornado má vestavěný balíček pro WebSockets, který lze snadno použít s koroutinami k dosažení souběhu, zde je jeden příklad:
KÓD: https://gist.github.com/velotiotech/34d0a0e0ecd57818ae1db1697c075777.js
K připojení k serveru lze použít klientskou aplikaci WebSocket, zpráva může být libovolné celé číslo. Po zpracování klient obdrží výsledek, zda je celé číslo prvočíslo, nebo ne.
Tady je ještě jeden příklad aktuálních asynchronních funkcí Tornada. Mnohým se bude zdát podobný goroutine a kanálům Golangu.
V tomto příkladu můžeme spustit worker(y) a ty budou naslouchat ‚tornado.queue‘. Tato fronta je asynchronní a velmi podobná balíčku asyncio.
KÓD: https://gist.github.com/velotiotech/1477131948ca23879167df0281726d02.js
Závěr
1) Asynchronní frameworky nejsou příliš užitečné, pokud je většina výpočtů zaměřena na CPU a ne na I/O.
2) Díky modelu jednoho vlákna na jádro a smyčce událostí dokáže spravovat tisíce aktivních klientských spojení.
3) Mnozí říkají, že Django je příliš velké, Flask je příliš malý a Tornado je tak akorát:)