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.
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