2015-03-16 12 views
5

Próbuję wyświetlać dokumenty bokeh za pośrednictwem Django za pomocą pliku wykonywalnego bokeh-server, który tworzy instancję Tornado. Dokumenty w formacie bokeh można uzyskać za pośrednictwem adresu URL podanego w metodzie Session.object_link. Po przejściu do wykonywalny bokeh-serwer zapisuje to na stdout (adresy IP zostały zastąpione elipsy):Sesja Bokeh i pobieranie dokumentów

INFO:tornado.access:200 POST /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/gc (...) 222.55ms 
INFO:tornado.access:200 GET /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/ (...) 110.15ms 
INFO:tornado.access:200 POST /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/gc (...) 232.66ms 
INFO:tornado.access:200 GET /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/ (...) 114.16ms 

Wydaje się to być komunikacja między instancji Pythona uruchomioną aplikację Django WSGI (zainicjowany przez Apache mod_wsgi) i plik wykonywalny bokeh-server.

Po wysłaniu przeglądarki odpowiedź, w tym wykresy i dane itp. Wymagane dla interfejsu bokeh, istnieje początkowa sieć do przeglądarki, a następnie sieć, jeśli istnieje jakakolwiek interakcja z wykresami, które mają wywołania Pythona. Gdy użytkownik zamknie okno lub przeglądarkę, powyższa sieć działa nadal. Co więcej, tworzenie sieci zatrzymuje się tylko wtedy, gdy procesy Django lub serwera bokeh są zabijane.

Aby rozpocząć sesję bokeh i przekazać adres URL z powrotem do szablonu Django, konieczne jest, aby rozpocząć sesję bokeh w nowym wątku:

def get_bokeh_url(self, context): 
     t = Thread(target=self.run) 
     t.start() 

     return self.session.object_link(self.document.context) 

def run(self): 
    return self.session.poll_document(self.document) 

self.session i self.document były zarówno zainicjowany przed wątku zostało rozpoczęte. Tak więc w momencie wywołania get_bokeh_url istnieją pewne wykresy na dokumencie, z których niektóre mają wywołania zwrotne interakcji i sesja została utworzona, ale nie została odpytana przez poll_document (która wydaje się konieczna do interakcji).

Wątek działa wiecznie, chyba że zabijesz Django lub serwer bokeh. Oznacza to, że gdy pojawia się więcej zapytań, rośnie liczba wątków i rośnie liczba kontaktów.

Moje pytanie brzmi, czy istnieje sposób na zabicie nici, gdy dokument nie jest już wyświetlany w przeglądarce?

Jedna z odpowiedzi, o którą się zastanawiałem, to wysłanie szybkiej prośby do serwera, gdy przeglądarka zamknie i jakoś zabije wątek dla tego dokumentu. Próbowałem usunąć dokumenty z interfejsu bokeh, ale nie ma to żadnego wpływu.

Odpowiedz

2

Serwer bokeh okresowo sprawdza, czy istnieją połączenia z sesją. Jeśli przez jakiś czas nie było połączeń, sesja wygasła i została zniszczona.

Począwszy od wersji 0.12.1, interwał sprawdzania i maksymalny czas braku połączenia wynoszą domyślnie odpowiednio 17 i 60 sekund. Można zastąpić je uruchamiając serwer jak ten

bokeh serve --check-unused-sessions 1000 --unused-session-lifetime 1000 app.py 

Jest to raczej trudno znaleźć w docs, jest to opisane w CLI documentation i w przewodniku dewelopera, w section on Applications, Sessions and Connections w rozdziale Architektury Server. Jest też zamknięte Github problem na ten temat: Periodic callbacks continue after tabs are closed #3770

Jeśli potrzebujesz niestandardowego logiki, gdy sesja jest zniszczony, należy directory deploy format dla swojej aplikacji i dodać plik server_lifecycle.py zawierające swoją Lifecycle Hooks, szczególnie ten jeden:

def on_session_destroyed(session_context): 
    ''' If present, this function is called when a session is closed. ''' 
    pass 
+1

FYI Sekcja Dokumenty CLI jest generowana automatycznie z docstrings, itp. PR do dodawania dokumentów narracyjnych do takich rzeczy w [Uruchamianie serwera Bokeh] (http://bokeh.pydata.org/en/latest/docs/user_guide /serwer.html) z pewnością zostanie doceniony, jeśli masz taką możliwość. – bigreddot