Twisted Silnik Twojego Internetu Jan Urbański wulczer@wulczer.org Ducksboard PyWaw #25, Warszawa, 10 czerwca 2013 Jan Urbański (Ducksboard) Twisted PyWaw #25 1 / 23
1 Co to jest Twisted? Strona techniczna Filozofia 2 Model działania Pętla zdarzeń Jan Urbański (Ducksboard) Twisted PyWaw #25 2 / 23
Zarys Co to jest Twisted? Strona techniczna 1 Co to jest Twisted? Strona techniczna Filozofia 2 Model działania Jan Urbański (Ducksboard) Twisted PyWaw #25 3 / 23
Co to jest Twisted? Programowanie asynchroniczne Strona techniczna wiekszość programów jest ograniczona przez I/O Twisted stara się zmaksymalizować przepustowość przez wykonywanie operacji asynchronicznie w czasie, gdy aplikacja czeka na zakończenie zapytania w bazie danych...... wysyła już zrenderowany szablon innemu klientowi... w czasie, gdy klient odczytuje dane z sieci...... parsuje nagłówki od następnego klienta metoda holywoodzka: nie dzwoń, my zadzwonimy Jan Urbański (Ducksboard) Twisted PyWaw #25 4 / 23
Krótki opis Co to jest Twisted? Strona techniczna biblioteka do pisania programów sieciowych zarówny klientów, jak i serwerów asynchroniczny model działania wsparcie dla wielu protokołów HTTP, FTP, SMTP DNS, NNTP, SSH... i bardziej egzotyczne dużo pomocniczych bibliotek: parsowanie linii poleceń, obsługa wątków itp. Jan Urbański (Ducksboard) Twisted PyWaw #25 5 / 23
Co to jest Twisted? Przykładowe zastosowania Strona techniczna serwer pocztowy, który parsuje pocztę i przesyła ją przez HTTP do innego systemu serwer przyjmujący połączenia WebSockets i wsyłający klientom dane z kolejki AMQP + interfejs administracyjny przez SSH serwer FTP, który publikuje na Twitterze i na kanale jabberowym każdy nowy upload program wyświetlający na tablicy LED najnowsze pytania ze StackOverflow z tagiem Python Jan Urbański (Ducksboard) Twisted PyWaw #25 6 / 23
Zarys Co to jest Twisted? Filozofia 1 Co to jest Twisted? Strona techniczna Filozofia 2 Model działania Jan Urbański (Ducksboard) Twisted PyWaw #25 7 / 23
Co to jest Twisted? Filozofia w kilku słowach Filozofia niespotykany nacisk na jakość kodu jedna z najinteligentniejszych społeczności wolnego oprogramowania dużo interfejsów i dokumentacji, wyłącznie przemyślane decyzje niepowstrzymany, nawet jeśli powolny, marsz ku ideałowi celem jest zniszczenie amerykańskiej waluty promieniami TCP IP Jan Urbański (Ducksboard) Twisted PyWaw #25 8 / 23
Historia Co to jest Twisted? Filozofia Twisted powstaje w połowie 2000 roku Python 2.0 został wydany w październiku 2000 roku PEP8 powstaje w sierpniu 2001 roku moduł logging został zaimportowany do Pythona w listopadzie 2002 roku część projektu Ultima Online 2 początkowo w Javie, kod został szybko przepisany w Pythonie Jan Urbański (Ducksboard) Twisted PyWaw #25 9 / 23
Proces Co to jest Twisted? Filozofia UDQS (Ultimate Quality Development System) każda zmiana w kodzie ma odpowiadający ticket każda zmiana musi być przez kogoś sprawdzona wszystkie zmiany dokonywane są w gałęziach nowy kod wymaga 100% pokrycia testami pełna dokumentacja wszytkich publiczych funkcji i zmiennych niekompatybilne zmiany są zabronione Jan Urbański (Ducksboard) Twisted PyWaw #25 10 / 23
Zarys Model działania Pętla zdarzeń 1 Co to jest Twisted? 2 Model działania Pętla zdarzeń Jan Urbański (Ducksboard) Twisted PyWaw #25 11 / 23
Reaktor Model działania Pętla zdarzeń reaguje na wydarzenia i wywołuje kod użytkownika dane czekające na odczytanie z gniazda sieciowego kliknięcia myszki, dane z klawiatury dane na porcie szeregowym upływ czasu łatwy do zastąpienia dzięki dobrze zdefiniowanym interfejsom różne reaktory używają różnych mechanizmów systemowych select poll, epoll kqueue I/O Completion Ports pętle wydarzeń GTK, Qt Jan Urbański (Ducksboard) Twisted PyWaw #25 12 / 23
Zarys Model działania 1 Co to jest Twisted? 2 Model działania Pętla zdarzeń Jan Urbański (Ducksboard) Twisted PyWaw #25 13 / 23
Abstracja Deferred Model działania Deferred to inaczej Promise albo Future wartość, która nie jest jeszcze gotowa do użycia wynik zapytania do bazy danych rezultat operacji wykonanej w innym wątku lub procesie wykonanie metody na zdalnym obiekcie Deferred mogą wypalić albo zawieść Jan Urbański (Ducksboard) Twisted PyWaw #25 14 / 23
Callbacki i errbacki Model działania do Deferred można dołączyć funkcje callback i errback callback dostaje rezultat operacji, na którą Deferred czekał w razie błędów, sterowanie przechodzi do łańcucha errbacków errback może obsłużyć błąd, albo rzucić go dalej Jan Urbański (Ducksboard) Twisted PyWaw #25 15 / 23
Callbacki i errbacki, cd. Model działania Jan Urbański (Ducksboard) Twisted PyWaw #25 16 / 23
Sterowanie w Model działania jeśli callback zwróci Deferred, wykonanie na niego czeka jeśli callback zawiedzie, sterowanie przekazywane jest do najbliższego errbacku jeśli errback nie zwróci błędu, sterowanie wraca do callbacków wynik Deferred jest wynikiem zwróconym przez ostatni callback Jan Urbański (Ducksboard) Twisted PyWaw #25 17 / 23
Łączenie Model działania połączenie HTTP generuje apytanie do bazy danych... które zwraca identyfikator...... który jest użyty w zapytaniu do memcache...... którego odpowiedź zwraca adres email...... do którego wysyłana jest poczta i zapytanie HTTP się kończy Jan Urbański (Ducksboard) Twisted PyWaw #25 18 / 23
Łączenie, cd Model działania Łańcuch callbacków def handle_request(req): sid = req.cookies.get( session_id ) d = db.query( select id from ppl where sid = %s, sid) d.addcallback(email_from_cache) d.addcallback(send_mail) return d.addcallback(build_response, req) Jan Urbański (Ducksboard) Twisted PyWaw #25 19 / 23
Model działania Łączenie 2, cd Łańcuch callbacków def email_from_cache(user_id): return memcache.get(user_id).addcallback( lambda res: res[ email ]) def send_mail(email): return smtp.send_mail(email, so twisted! ) def build_response(res, req): req.finish(200, sent if res else not sent ) Jan Urbański (Ducksboard) Twisted PyWaw #25 20 / 23
Obsługa błędów Model działania Łańcuch errbacków def handle_request(req): sid = req.cookies.get( session_id ) d = db.query( select id from ppl where sid = %s, sid) d.addcallback(email_from_cache) d.adderrback(not_in_cache) d.addcallback(send_mail) d.addcallback(build_response, req) return d.adderrback(request_failed, req) Jan Urbański (Ducksboard) Twisted PyWaw #25 21 / 23
Obsługa błędów Model działania Łańcuch errbacków def not_in_cache(f): f.trap(noresultfound) return default@example.org def request_failed(f, req): req.finish(500, f.geterrormessage()) Jan Urbański (Ducksboard) Twisted PyWaw #25 22 / 23
Model działania Pytania Dzięki! Pytania? Jan Urbański (Ducksboard) Twisted PyWaw #25 23 / 23