Kiedy używać Tornado, kiedy używać Twisted / Cyclone / GEvent / other [zamknięte]

181

Która z tych frameworków / bibliotek byłaby najlepszym wyborem do budowy nowoczesnej aplikacji internetowej dla wielu użytkowników? Chciałbym mieć asynchroniczny serwer WWW, który pozwoli mi łatwo skalować. Jakie rozwiązanie zapewni najlepszą wydajność / skalowalność / najbardziej przydatne ramy (pod względem łatwości użytkowania i łatwości opracowywania)?

Byłoby świetnie, gdyby zapewnił dobrą funkcjonalność (websockets, rpc, streaming itp.).

Jakie są zalety i wady każdego rozwiązania?

Wojciech Danilo
źródło
Czy musi to być jeden z tych ram? Co planujesz zrobić i czy coś takiego jak Django, Pylony itp. ... może działać?
Joe Doherty,
Nie, oczywiście, że nie, ale chciałbym, aby był on asynchroniczny i miałby dobrą obsługę websockets - zaktualizowałem również to pytanie. Dziękuję Ci.
Wojciech Danilo,
3
To dość szerokie pytanie, prawda?
Jean-Paul Calderone,
Twój wybór zależy od bibliotek, których chcesz używać. Twoje biblioteki - na zadaniu, które chcesz rozwiązać.
Nikolay Fominyh,
1
Tak, jest szeroki, ale może być olvable. Zastanawiam się, czy te biblioteki są używane w produkcji i ktoś, kto korzysta z niektórych z nich na co dzień, jest w stanie powiedzieć, do czego są świetne, czego brakuje itp. Jaka powinna być podstawa wyboru biblioteki - może Twisted powinien być skonkretyzowany stracony, gdy mówimy o autostradzie lub cyklonie? A może mmaybe Autobahn i Cyclone nie są gotowe do produkcji, a ich utrzymanie jest kwestionowane? A może Tornado ma bardziej nowoczesny design i jego przyszłość będzie prawdopodobnie lśniąca i świetna i powinien to być wybór dla projektu startupowego?
Wojciech Danilo,

Odpowiedzi:

226

Django to wysokopoziomowy framework Python Web, który zachęca do szybkiego rozwoju i czystego, pragmatycznego projektowania” . Jeśli budujesz coś podobnego do witryny e-commerce, prawdopodobnie powinieneś skorzystać z Django. Dzięki temu Twoja praca zostanie wykonana szybko. Nie musisz się martwić o zbyt wiele wyborów technologicznych. Zapewnia wszystko, czego potrzebujesz, od silnika szablonów po ORM. Zostanie lekko poparta opiniami na temat struktury aplikacji, co jest dobre, jeśli mnie zapytasz. I ma najsilniejszą społeczność ze wszystkich innych bibliotek, co oznacza, że ​​dostępna jest łatwa pomoc.

Flask to mikrocząsteczka dla Pythona oparta na Werkzeug, Jinja 2 i dobrych intencjach” . Uwaga - „mikrozarządzanie” może wprowadzać w błąd. Nie oznacza to, że Flask jest biblioteką na wpół upieczoną. Oznacza to, że rdzeń kolby jest bardzo, bardzo prosty. W przeciwieństwie do Django, nie będzie podejmować żadnych decyzji dotyczących technologii. Masz swobodę wyboru dowolnego silnika szablonów lub ORM, który Ci się podoba. Mimo że domyślnie jest wyposażony w silnik szablonów Jinja, zawsze możesz wybrać własny. O ile wiem Flask jest przydatny do pisania punktów końcowych API (usługi RESTful).

Twisted to oparty na zdarzeniach silnik sieciowy napisany w języku python” . To silnik o wysokiej wydajności. Głównym powodem jego szybkości jest coś, co nazywa się odroczonym. Twisted jest zbudowany na odroczeniach. Dla tych z was, którzy nie wiedzą o odroczeniach, jest to mechanizm osiągnięty dzięki architekturze asynchronicznej. Twisted jest bardzo szybki. Ale nie nadaje się do pisania konwencjonalnych aplikacji internetowych. Jeśli chcesz zrobić coś w sieci na niskim poziomie, twisted jest twoim przyjacielem.

Tornado to framework sieciowy Python i biblioteka sieci asynchronicznych, pierwotnie opracowane w FriendFeed. Dzięki zastosowaniu nieblokujących sieciowych we / wy, Tornado może skalować się do dziesiątek tysięcy otwartych połączeń, dzięki czemu idealnie nadaje się do długiego odpytywania, WebSockets i innych aplikacji które wymagają długotrwałego połączenia z każdym użytkownikiem " . Tornado stoi pomiędzy Django i Flask. Jeśli chcesz napisać coś z Django lub Flask, ale jeśli potrzebujesz lepszej wydajności, możesz wybrać Tornado. potrafi dobrze poradzić sobie z problemem C10k, jeśli jest odpowiednio zaprojektowany.

Cyclone to framework serwera WWW dla Pythona, który implementuje interfejs API Tornado jako protokół Twisted” . Co jeśli chcesz czegoś, co jest prawie tak wydajne jak Twisted, ale łatwe do pisania konwencjonalne aplikacje internetowe? Przywitaj się z cyklonem. Wolałbym Cyklon niż Tornado. Ma API, które jest bardzo podobne do Tornado. W rzeczywistości jest to widelec Tornado. Problem w tym, że ma relatywnie małą społeczność. Alexandre Fiori jest jedynym głównym inicjatorem repozytorium.

Pyramid to ogólna platforma programistyczna do tworzenia aplikacji internetowych w języku open source. Jego głównym celem jest ułatwienie programistom Python tworzenia aplikacji internetowych”. Tak naprawdę nie korzystałem z Pyramid, ale przejrzałem dokumentację. Z tego, co rozumiem, Pyramid jest bardzo podobny do Flask i myślę, że możesz używać Pyramid wszędzie tam, gdzie Flask wydaje się odpowiedni i odwrotnie.

EDYCJA : Przyjmujemy prośbę o przejrzenie innych ram!

Źródło: http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html

Dhilipsiva
źródło
1
Django to mój preferowany framework. Jego dokumentacja jest bardzo dobra, a ORM jest łatwy. Południe doskonale nadaje się do migracji schematów baz danych ... Ale pytanie zawierało to: „Chciałbym mieć asynchroniczny serwer WWW, który pozwoli mi łatwo skalować”. Django został stworzony dla klasycznych stron z zapytaniami i odpowiedziami, nie dla asynchronizacji.
guettli
1
Czy możesz napisać o Pyramid?
Fizer Khan
5
@FizerKhan: Zgodnie z twoją prośbą zaktualizowałem odpowiedź. Przepraszam, że trwało to tak długo. Nie miałem czasu na użycie Pyramid. Ale przejrzałem dokumentację.
dhilipsiva
1
Dodam, że środowisko jednowątkowe, z którego korzysta Tornado, jest bardziej podatne na błędy - błąd, który powoduje, że kod pojedynczego punktu końcowego API jest wolniejszy, z łatwością spowoduje problemy dla wszystkich punktów końcowych.
Abel Molina
1
Czy mógłbyś skomentować cherrypy?
Stavros Avramidis
60

Jest to oczywiście dość stronnicza odpowiedź, ale to nie to samo, co zła odpowiedź; zawsze powinieneś używać Twisted. Odpowiedziałem wcześniej na podobne pytania , ale ponieważ twoje pytanie nie jest takie samo, oto kilka powodów:

"Najlepsza wydajność"

Twisted stale monitoruje naszą wydajność na stronie speed.twistedmatrix.com . Byliśmy również jednym z pierwszych projektów monitorowanych przez podobną witrynę PyPy , zapewniając tym samym dobrą wydajność Twisted w środowisku wykonawczym, którą każdy zainteresowany wysokowydajnymi aplikacjami w Pythonie.

„Skalowalność”

O ile mi wiadomo, żaden z wymienionych frameworków nie ma wbudowanej obsługi automatycznego skalowania; wszystkie są strukturami komunikacyjnymi, więc musisz wykonać pracę, aby komunikować się między swoimi węzłami skalowania. Jednak Twisted ma tę zaletę, że ma wbudowaną obsługę lokalnego przetwarzania wielu elementów . Szczerze mówiąc, istnieje dodatek do Tornado innej firmy, który pozwala robić to samo. W ostatnich wydaniach Twisted dodał funkcje, które zwiększają liczbę sposobów dzielenia pracy między rdzeniami, a praca w tym obszarze trwa. Twisted ma również kilka dobrze zintegrowanych , „natywnych” protokołów RPC, które oferują zestaw konstrukcyjny dla dowolnego idiomu skalowania, który chcesz realizować.

"Najbardziej użyteczne"

Wiele osób uważa, że ​​Twisted jest bardzo przydatny . Tak bardzo, że wielu z nich rozszerzyło go i udostępniło ci swoje rozszerzenia.

„Funkcjonalność”

Po wyjęciu z pudełka Twisted obejmuje:

W tym ostatnim dziale Twisted wydaje się wyraźnym zwycięzcą pod względem wbudowanej funkcjonalności. A wszystko to w paczce nieco ponad 2 megabajty!

Glif
źródło
6
dlaczego tak wielu ludzi twierdzi, że nie używa już Twisted, ale GEvent?
remdezx,
1
Wiele osób mówi, że trudno jest utrzymywać duże aplikacje za pomocą Twisted (ze względu na architekturę zwrotną): stackoverflow.com/questions/3048012/... Czy nie byłoby lepiej używać Twisted opartego na Gevent lub Gevent?
Wojciech Danilo
8
@remdezx Co do twojego pytania, istnieją dwa powody. Jednym z nich jest to, że ludzie uważają Twisted za trudny do zrozumienia, ponieważ trudne jest jednoczesne programowanie. Następnie przechodzą na GEvent, ponieważ jest to powierzchownie łatwe do zrozumienia - dopóki nie ma współbieżności, wszystko działa tak, jak można się spodziewać. Innym powodem jest to, że przenoszenie kodu do GEvent jest o wiele mniej pracy, co nie zostało napisane przy użyciu interfejsu API sterowanego zdarzeniami, aby uzyskać korzyści wydajnościowe we / wy sterowanych zdarzeniami. Jeśli twój kod nie współdzieli zbyt wiele stanów, taki port prawdopodobnie działa dobrze.
Glyph
1
@Glyph, mówisz o współbieżności, ale ... ani Gevent, ani Twisted nie wspierają współbieżności (oczywiście możesz używać wieloprzetwarzania z geventem i używać puli prawdziwych wątków i puli zieleni dla każdego wątku - co działa dobrze dla mnie i możesz użyć wtyczki Twisted, aby zrobić dokładnie to samo - uruchomić wiele skręconych intencji obok siebie). Ale czy Twisted daje ci coś więcej niż gevent? Myślę, że nawet przy wielu przypadkach gevent / twisted, gevent jest łatwiejszy do zrozumienia bez wyraźnych oddzwonień. Czy coś brakuje?
Wojciech Danilo,
2
@ danilo2 Tak, brakuje Ci co najmniej jednej rzeczy :). W szczególności źle rozumiesz słowo „współbieżność”, co oznacza „równoległe wykonywanie równoległe na wielu procesorach”. Twisted może wykonywać równoległe planowanie operacji we / wy za pośrednictwem asynchronicznych operacji we / wy. GEvent może wykonywać równoległe planowanie operacji we / wy za pomocą harmonogramu mikro-wątków. W trybie Twisted przy użyciu spawnProcesstego planowania we / wy można również przełożyć na planowanie procesora.
Glyph
48

Lubię odpowiedź @Glyph. Twisted jest bardzo wszechstronnym, bogatym frameworkiem Pythona. Twisted i Tornado mają bardzo podobny projekt. Bardzo podoba mi się ten projekt:

  • to jest szybkie
  • łatwy do zrozumienia
  • łatwe do przedłużenia
  • nie wymaga rozszerzeń c
  • działa na PyPy.

Ale chcę podkreślić Tornado , które wolę i ostatnio zyskało popularność. Tornado, podobnie jak Twisted, wykorzystuje programowanie w stylu wywołania zwrotnego, ale można je wstawiać za pomocą tornado.gen.engine( twisted.internet.inlineCallbacksw Twisted).

Codebase

Najlepszy komentarz pochodzi ze strony http://cyclone.io . cyklon próbuje połączyć Twisted i Tornado, ponieważ:

Twisted to jedna z najbardziej dojrzałych bibliotek dla nieblokujących I / O dostępnych publicznie. Tornado to otwarta wersja serwera WWW FriendFeed, jednego z najpopularniejszych i szybkich serwerów WWW dla Pythona, z bardzo przyzwoitym API do tworzenia aplikacji internetowych.

Pomysł polega na połączeniu eleganckiego i prostego interfejsu API Tornado z pętlą zdarzeń Twisted, umożliwiając ogromną liczbę obsługiwanych protokołów.

Ale w 2011 roku tornado.platform.twistedzostał wydany, który przynosi podobną funkcjonalność.

Występ

Tornado ma znacznie lepszą wydajność . Działa również płynnie z PyPy i zyskuje ogromny zysk.

Skalowalność

To samo co Twisted. Tornado ma tornado.processi wiele usług RPC zaimplementowanych na nim.

Funkcjonalność

Istnieje 71 pakietów opartych na Tornado, w porównaniu do 148 Twisted i 48 Gevent. Ale jeśli przyjrzysz się uważnie i obliczysz medianę czasu wysyłania pakietów, zobaczysz, że Twisted są najstarsze, a następnie Gevent i Tornado najświeższe. Ponadto istnieje tornado.platform.twistedmoduł, który pozwala uruchamiać kod napisany dla Twisted na Tornado .

Podsumowanie

W Tornado możesz użyć kodu z Twisted. Nie ma potrzeby używania cyklonu, który jedynie przekręca kod (kod staje się bardziej nieuporządkowany).

Jeśli chodzi o 2014 r., Tornado jest uważane za powszechnie akceptowaną i domyślną platformę asynchroniczną, która działa zarówno na python2, jak i python3. Również najnowsza wersja 4.x oferuje wiele funkcji z https://docs.python.org/dev/library/asyncio.html .

Napisałem artykuł, wyjaśniając, dlaczego uważam, że Tornado - najlepsza platforma internetowa Python, w której napisałam znacznie więcej o funkcjonalności Tornado.

Robert Zaremba
źródło
15

( AKTUALIZACJA : Jestem niestety zaskoczony, jak niewiele odpowiedzi tutaj poleca, a nawet wspomina o Gevencie - nie sądzę, aby było to proporcjonalne do popularności, wydajności i łatwości korzystania z tej doskonałej biblioteki!)

Gevent i Twisted nie wykluczają się nawzajem, chociaż na początku może się wydawać oczywiste. Istnieje projekt, geventreactorktóry pozwala stosunkowo płynnie wykorzystać to, co najlepsze z obu światów, a mianowicie:

  • Wydajny i tani (współpracujący zielony) model wątków Gevent, który jest znacznie łatwiejszy do zaprogramowania, jeśli chodzi o współbieżność - szczerze mówiąc, Twisted's inlineCallbacks po prostu nie radzi sobie z wydajnością, jeśli chodzi o wiele korporacji, i ani w warunki łatwości / przejrzystości użytkowania: yieldi Deferredswszędzie; często trudno zbudować jakieś abstrakcje; przerażająco bezużyteczne ślady na stosie zarówno z nagimi, Deferredjak i jeszcze bardziej z @inlineCallbacks.
  • Wszystkie wbudowane funkcje Twisted, o których możesz marzyć, w tym między innymi IReactorProcess.spawnProcess.

Obecnie osobiście używam Gevent 1.0rc2 z Twisted 12.3 zmostkowanym przez geventreactor. Wdrożyłem własne niepublikowane jeszcze dodatki i rozszerzenia dogeventreactor które wkrótce opublikuję, mam nadzieję, że w ramach geventreactororyginalnego repozytorium GitHub: https://github.com/jyio/geventreactor .

Mój obecny układ pozwala mi programować w ładnym modelu programowania Gevent i wykorzystywać takie rzeczy, jak nieblokowanie socket , urllib2i innych modułów. Mogę używać zwykłego kodu Python do robienia regularnych czynności, w przeciwieństwie do krzywej uczenia się i niedogodności związanych z robieniem nawet prostych, podstawowych rzeczy w Twisted sposób. Mogę również z łatwością korzystać z większości bibliotek stron trzecich, które zwykle nie są kwestionowane w Twisted lub wymagają użycia wątków.

Mogę również całkowicie uniknąć niewygodnego i często zbyt złożonego programowania opartego na wywołaniu zwrotnym, używając greenletów (zamiast Deferred s i callbacków i / lub @inlineCallbacks).

(Ta odpowiedź została napisana w oparciu o moje osobiste doświadczenia z wykorzystaniem zarówno Twisted, jak i Gevent w rzeczywistych projektach, ze znacznie większym doświadczeniem w korzystaniu z Twisted (ale nie twierdzę, że jestem ekspertem od Twisted). Oprogramowanie, które musiałem napisać, nie ma musiałem użyć zbyt wielu funkcji Twisted, więc w zależności od zestawu funkcji wymaganych od Twisted, (stosunkowo bezbolesna) dodatkowa złożoność mieszania Gevent i Twisted może nie być warta kłopotów).

Erik Kaplun
źródło