2014-04-16 17 views
28

Obecnie badam obsługę websocket w Pythonie i jestem nieco zdezorientowany ofertą.Websockets w Flask

Z jednej strony można używać Flask + gevent. Z drugiej strony, uwsgi ma socket support i na końcu jest rozszerzenie, które łączy zarówno uwsgi and gevent.

Na czym polega problem z implementacją websockets tylko z jednym z nich? Co wygrywam, mieszając je?

Zmiana pytanie

Co zrobić dodając gevent że gwintowane uwsgi nie będzie?

+0

Istnieje rozszerzenie napisane przez Kennetha Reitza o nazwie "Gniazda na flask", które jest doskonałe dla gniazd internetowych. Sprawdź to. https://github.com/kennethreitz/flask-sockets – codegeek

+1

Dzięki, ale jestem również zainteresowany odkryciem roli geventu w tym bałaganie. – ruipacheco

+0

Powiedziałbym, ponieważ jest to asynchroniczne. Tak więc pojedynczy pracownik nie zajmuje się wyłącznie jednym klientem. –

Odpowiedz

63

W zwykłych żądaniach HTTP połączenia między klientem a serwerem są krótkotrwałe, klient łączy się z serwerem, wysyła żądanie, odbiera odpowiedź, a następnie zamyka połączenie. W tym modelu serwer może obsługiwać dużą liczbę klientów korzystających z niewielkiej liczby pracowników. Model współbieżności w tej sytuacji jest zwykle oparty na wątkach, procesach lub ich kombinacji.

Gdy używasz websocket problem jest bardziej złożony, ponieważ połączenie z internetem jest otwarte przez długi czas, więc serwer nie może korzystać z małej puli pracowników do obsługi dużej liczby klientów, każdy klient musi uzyskać własnego oddanego pracownika. Jeśli używasz wątków i/lub procesów, aplikacja nie będzie skalowana, aby obsługiwać dużą liczbę klientów, ponieważ nie możesz mieć dużej liczby wątków/procesów.

To jest, gdzie gevent wchodzi w obraz. Gevent ma model współbieżności oparty na greenletach, który skaluje się znacznie lepiej niż wątki/procesy. Tak więc obsługa połączeń websocket z serwerem bazującym na geenie pozwala na obsługę większej liczby klientów, ze względu na małą wagę greenletów. Za pomocą interfejsu uWSGI można wybierać modele współbieżności do korzystania z gniazd internetowych, w tym model oparty na zieleni z geventu. Jeśli chcesz, możesz również użyć autonomicznego serwera sieciowego Gevent.

Należy jednak pamiętać, że gevent nie wie nic o gniazdach internetowych, jest tylko serwerem. Aby korzystać z połączeń websocket, musisz dodać implementację serwera websocket.

Istnieją dwa rozszerzenia do kolby, które upraszczają korzystanie z gniazd internetowych. Rozszerzenie Flask-Sockets autorstwa Kennetha Reitza to opakowanie dla gevent i gevent-websocket. Rozszerzenie Flask-SocketIO (bezwstydna wtyczka, ponieważ jestem autorem) jest opakowaniem dla gevent i gevent-socketio na serwerze, plus Socket.IO na kliencie. Socket.IO to protokół gniazda wyższego poziomu, który może korzystać z gniazda internetowego, jeśli jest dostępny, ale może również korzystać z innych mechanizmów transportu w starszych przeglądarkach.

Mam nadzieję, że to pomoże!

+0

@Miguel - Jak uruchomić Socket.IO, jeśli używam menedżera? Nie mogę przepisać - socketio.run (app) – moaglee

+0

@moaglee Nie rozumiem twojego problemu. Czy chciałbyś napisać osobne pytanie ze wszystkimi szczegółami? – Miguel