2011-08-16 15 views
24

chcę wiedzieć wewnętrzny obieg tornado, a widzieliśmy this article, to nic wielkiego, ale coś po prostu nie może dowiedzieć sięCo to jest tornado ioloop i przepływ pracy tornada?

w ioloop.py istnieje taka funkcja

def add_handler(self, fd, handler, events): 
    """Registers the given handler to receive the given events for fd.""" 
    self._handlers[fd] = handler 
    self._impl.register(fd, events | self.ERROR) 

tak Co to znaczy? każde żądanie wywoła add_handler lub zostanie wywołane tylko raz, gdy init?

każde połączenie z gniazdem wygeneruje deskryptor pliku lub zostanie wygenerowane tylko raz?

Jaki jest związek między ioloop i iostream?

Jak działa serwer http z ioloop i iostream?

Czy istnieje jakikolwiek schemat przepływu pracy, więc mogę go wyraźnie zobaczyć?

żal tych questiones, po prostu mylić

dowolny link sugestia, wskazówka pomoże. wielkie dzięki :)

Odpowiedz

29

Zobaczę, czy mogę odpowiedzieć na pytania w kolejności:

  • Tutaj _impl jest cokolwiek gniazdo odpytywania mechanizm jest dostępny, epoll na Linuksie, select na Windows. Tak więc self._impl.register(fd, events | self.ERROR) przekazuje żądanie "oczekiwanie na pewne zdarzenie" do podstawowego systemu operacyjnego, w szczególności zawierające zdarzenia błędu.

    Po uruchomieniu, HTTPServer zarejestruje gniazda do akceptowania połączeń, używając IOLoop.add_handler(). Gdy połączenia są akceptowane, wygenerują więcej gniazd komunikacyjnych, które prawdopodobnie również dodadzą funkcje obsługi zdarzeń za pośrednictwem IOStream, które mogą również wywoływać add_handler(). Nowe prowadnice zostaną dodane zarówno na początku, jak i po otrzymaniu połączeń.

  • Tak, każde nowe połączenie z gniazdem będzie miało unikalny deskryptor pliku. Oryginalne gniazdo nasłuchiwania HTTPServer powinno jednak zachować deskryptor pliku. Deskryptory plików są dostarczane przez system operacyjny.

  • Obsługuje zdarzenia związane z gniazdami, na przykład czy mają one dane do odczytania, czy mogą być zapisywane i czy wystąpił błąd. Korzystając z usług systemu operacyjnego, takich jak epoll lub select, może to zrobić bardzo skutecznie.

    Obsługuje przesyłanie strumieniowe danych przez jedno połączenie i korzysta z IOLoop, aby wykonać to asynchronicznie. Na przykład IOStream może odczytać tyle danych, ile jest dostępnych, a następnie użyć IOLoop.add_handler(), aby poczekać, aż będzie dostępnych więcej danych.

  • Na listen(), HTTPServer tworzy gniazdo, którego używa do nasłuchu połączeń przy użyciu IOLoop. Po uzyskaniu połączenia używa on socket.accept() do utworzenia nowego gniazda, które następnie jest używane do komunikacji z klientem przy użyciu nowego HTTPConnection.

    Urządzenie HTTPConnection używa IOStream do przesyłania danych do lub od klienta. Ten IOStream używa do tego celu IOLoop w sposób asynchroniczny i nieblokujący. Wiele obiektów może być aktywnych jednocześnie, wszystkie używają tego samego obiektu i .

Mam nadzieję, że to odpowie na niektóre z Twoich pytań. Nie znam dobrego wykresu strukturalnego, ale ogólny pomysł powinien być dość podobny dla innych serwerów sieciowych, więc może być trochę dobrych informacji. Ten dogłębny artykuł, do którego linkowałeś, wyglądał całkiem użytecznie, więc jeśli rozumiesz wystarczająco, polecam dać mu jeszcze raz :).

+0

"będą generować więcej gniazd komunikacyjnych", czy gniazda gniazd wewnętrznych Linuksa (gniazda domeny unix)? – limboy

+1

@Izyy Wierzę, że są to "gniazda internetowe" (typu socket.AF_INET w pythonie). Wikipedia ma dobre informacje. Główne gniazdo nasłuchujące będzie miało tylko adres odbiorczy + port, ale każde nowe gniazdo komunikacyjne będzie miało zarówno lokalny, jak i zdalny adres + port, umożliwiając mu zastosowanie wyłącznie do każdego połączenia klienckiego, nawet jeśli mają ten sam lokalny adres na serwerze . Nie jestem jednak pewien dokładnych szczegółów implementacji :). – mesilliac

+0

dzięki za wyjaśnienie :) – limboy

Powiązane problemy