Przewodnik dla początkujących po Pythonie Tornado

Sieć jest teraz wielkim miejscem. Musimy obsługiwać tysiące klientów naraz, i tu pojawia się Tornado. Tornado jest frameworkiem sieciowym w Pythonie i asynchroniczną biblioteką sieciową, pierwotnie stworzoną w FriendFreed.

Tornado używa nieblokującej sieci-io. Dzięki temu może obsługiwać tysiące aktywnych połączeń z serwerami. Jest wybawieniem dla aplikacji, w których utrzymywane są długie pollingi i duża liczba aktywnych połączeń.

Tornado nie jest jak większość frameworków Pythona. Nie jest oparte na WSGI, choć wspiera niektóre cechy WSGI używając modułu `tornado.wsgi`. Używa konstrukcji pętli zdarzeń, która sprawia, że wykonywanie żądań w Tornado jest szybsze.

Co to jest program synchroniczny?

Funkcja blokuje się, wykonuje swoje obliczenia i wraca, gdy już je wykona. Funkcja może blokować z wielu powodów: sieciowe I/O, dyskowe I/O, muteksy, itp.

Wydajność aplikacji zależy od tego, jak efektywnie aplikacja wykorzystuje cykle procesora, dlatego blokowanie deklaracji/wywołań musi być traktowane poważnie. Rozważmy funkcje haszowania haseł, takie jak bcrypt, które z założenia wykorzystują setki milisekund czasu procesora, znacznie więcej niż typowy dostęp do sieci lub dysku. Ponieważ procesor nie jest bezczynny, nie ma potrzeby, aby przejść do funkcji asynchronicznych.

Funkcja może być blokująca w jednym, a nieblokująca w innych. W kontekście Tornado, generalnie rozważamy blokowanie z powodu sieci I/O i dysku, chociaż wszystkie rodzaje blokowania muszą być zminimalizowane.

Co to jest Program Asynchroniczny?

1) Architektura jednowątkowa:

Oznacza, że nie może wykonywać zadań obliczeniowych równolegle.

2) Współbieżność I/O:

Może przekazywać zadania IO do systemu operacyjnego i kontynuować do następnego zadania, aby osiągnąć równoległość.

3) epoll/ kqueue:

Podkreślenie konstruktu związanego z systemem, który pozwala aplikacji uzyskać zdarzenia na deskryptorze pliku lub zadaniach specyficznych dla I/O.

4) Pętla zdarzeń:

Używa epoll lub kqueue do sprawdzenia, czy wystąpiło jakieś zdarzenie, i wykonuje callback, który czeka na te zdarzenia sieciowe.

Asynchronous vs Synchronous Web Framework:

W przypadku modelu synchronicznego, każde żądanie lub zadanie jest przekazywane do wątku lub routingu, a ponieważ kończy się, wynik jest przekazywany do dzwoniącego. Tutaj zarządzanie rzeczami jest łatwe, ale tworzenie nowych wątków jest zbyt dużym narzutem.

Z drugiej strony, w ramach asynchronicznych, takich jak Node.js, istnieje model jednowątkowy, więc bardzo mniejszy narzut, ale ma złożoność.

Wyobraźmy sobie tysiące żądań przechodzących przez i serwer używa pętli zdarzeń i wywołań zwrotnych. Teraz, dopóki żądanie nie zostanie przetworzone, musi skutecznie przechowywać i zarządzać stanem tego żądania, aby zmapować wynik wywołania zwrotnego do rzeczywistego klienta.

Node.js vs Tornado

Większość z tych punktów porównawczych jest związana z faktycznym językiem programowania, a nie z ramami:

  • Node.js ma jedną wielką zaletę, że wszystkie jego biblioteki są Async. W Pythonie, jest wiele dostępnych pakietów, ale bardzo niewiele z nich jest asynchronicznych
  • Jako że Node.js jest runtime’m JavaScript, i możemy używać JS zarówno dla front- jak i back-endu, programiści mogą utrzymywać tylko jedną bazę kodu i dzielić się tą samą biblioteką użytkową
  • Google’owski silnik V8 sprawia, że Node.js jest szybszy niż Tornado. Ale wiele bibliotek Pythona jest napisanych w C i może być szybszymi alternatywami.

Prosty przykład 'Hello World’

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

Uwaga: Ten przykład nie używa żadnej funkcji asynchronicznej.

Używając modułu AsyncHTTPClient, możemy wykonać wywołanie REST asynchronicznie.

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

Jak widać `yield http_client.fetch(url)` zostanie uruchomiony jako coroutine.

Kompleksowy przykład Tornado Async

Przyjrzyjrzyj się Asynchronous Request handler.

WebSockets Using Tornado:

Tornado posiada wbudowany pakiet dla WebSockets, który może być łatwo użyty z coroutines do osiągnięcia współbieżności, oto jeden z przykładów:

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

Można użyć aplikacji klienckiej WebSocket do połączenia się z serwerem, wiadomość może być dowolną liczbą całkowitą. Po przetworzeniu klient otrzymuje wynik, czy dana liczba całkowita jest pierwsza czy nie.
Tutaj jest jeszcze jeden przykład rzeczywistych funkcji async w Tornado. Wielu uzna to za podobne do Goroutine i kanałów Golanga.

W tym przykładzie, możemy uruchomić worker(y), które będą nasłuchiwały 'tornado.queue’. Kolejka ta jest asynchroniczna i bardzo podobna do pakietu asyncio.

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

Wnioski

1) Asynchroniczne frameworki nie mają większego zastosowania, gdy większość obliczeń jest CPU centric, a nie I/O.

2) Dzięki pojedynczemu wątkowi na rdzeń model i pętla zdarzeń, może zarządzać tysiącami aktywnych połączeń klienckich.

3) Wielu mówi, że Django jest za duży, Flask za mały, a Tornado jest w sam raz:)

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.