2015-03-16 8 views
5

Ich versuche, Bokeh-Dokumente über Django mit der ausführbaren Datei bokeh-server zu bedienen, die eine Tornado-Instanz erstellt. Auf die Bokeh-Dokumente kann über die von der Methode Session.object_link bereitgestellte URL zugegriffen werden. Wenn navigiert, schreibt der Bokeh-Server ausführbare dies dem stdout (IP-Adressen mit Ellipsen ersetzt wurden):Bokeh Sitzung und Dokumentenabruf

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 

Diese Kommunikation zwischen der Python-Instanz zu sein scheint, die Django WSGI App läuft (initialisiert durch Apache läuft mod_wsgi) und die ausführbare Datei von Bokeh-Server.

Wenn der Browser die Antwort einschließlich der für die Bokeh-Schnittstelle erforderlichen Diagramme und Daten usw. sendet, gibt es eine erste Vernetzung mit dem Browser, gefolgt von einem Netzwerk, wenn es eine Interaktion mit den Graphen gibt, die Python-Callbacks haben. Wenn der Benutzer das Fenster oder den Browser schließt, wird dasselbe Netzwerk weiter oben ausgeführt. Außerdem stoppt das Netzwerk nur, wenn die Django- oder Bokeh-Server-Prozesse beendet werden.

Um eine Bokeh-Sitzung zu starten und eine URL zurück in der Django-Vorlage übergibt, ist es notwendig, die Bokeh-Sitzung in einem neuen Thread zu starten:

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 und self.document sowohl vor dem Thread initialisiert wurden wurde gestartet. An dem Punkt, an dem get_bokeh_url aufgerufen wird, gibt es einige Diagramme im Dokument, von denen einige Interaktionsrückrufe haben und die Sitzung erstellt, aber nicht über poll_document abgefragt wurde (was für die Interaktion notwendig erscheint).

Der Thread läuft für immer, es sei denn, Sie töten entweder Django oder Bokeh-Server. Das heißt, wenn mehr Anfragen eingehen, werden mehr Threads aufgebaut und die Menge an Netzwerken steigt.

Meine Frage ist, gibt es eine Möglichkeit, den Thread zu töten, sobald das Dokument nicht mehr in einem Browser angezeigt wird?

Eine Antwort, über die ich nachgedacht habe, wäre, eine schnelle Anfrage an den Server zu senden, wenn der Browser schließt und irgendwie den Thread für dieses Dokument killt. Ich habe versucht, die Dokumente von der Bokeh-Oberfläche zu löschen, aber das hat keine Wirkung.

Antwort

2

Der Bokeh-Server überprüft regelmäßig, ob Verbindungen zu einer Sitzung bestehen. Wenn seit einiger Zeit keine Verbindungen mehr bestehen, ist die Sitzung abgelaufen und zerstört.

Ab Version 0.12.1 sind das Prüfintervall und die maximale verbindungslose Zeit standardmäßig auf 17 bzw. 60 Sekunden eingestellt. Sie können sie außer Kraft setzen, indem Sie den Server wie diese

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

läuft Dies ist ziemlich hart in der Dokumentation zu finden, die es beschrieben ist in den CLI documentation und in den Entwicklerführungs, in einem section on Applications, Sessions and Connections im Server-Architektur Kapiteln. Es gibt auch eine geschlossene Github Frage zu diesem Thema: Periodic callbacks continue after tabs are closed #3770

Wenn Sie benutzerdefinierte Logik benötigen, wenn eine Sitzung, die directory deploy format für Ihre App verwenden zerstört wird und fügen Sie eine server_lifecycle.py Datei Ihre Lifecycle Hooks enthält, speziell diese:

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

FYI der CLI Docs-Bereich wird automatisch aus Docstrings usw. generiert. Ein PR, um narrative Dokumente für solche Dinge in [Einen Bokeh-Server ausführen] (http://bokeh.pydata.org/en/latest/docs/user_guide) hinzuzufügen /Server.html) Kapitel würde sicherlich geschätzt werden, wenn Sie die Möglichkeit haben. – bigreddot