Ein Bokeh-Objekt ist eine Figur, die 3 unabhängige Linien zeigt.Bokeh + Flask: Mehrere AjaxDataSource-Aufrufe
Daten werden gestreamt. Ein AjaxDataSource-Aufruf aktualisiert die Daten alle 5 Sekunden und liest die letzten Daten aus einer Datenbank.
Dies ist die abgespeckte Klasse:
class Graph:
def __init__(self):
data_source = AjaxDataSource(data=dict(date_time=[],
value_1=[],
value_2=[],
value_3=[]),
data_url="/data",
polling_interval=5000)
line1 = self.figure.line(x="date_time", y="value_1", source=data_source)
line2 = self.figure.line(x="date_time", y="value_2", source=data_source)
line3 = self.figure.line(x="date_time", y="value_3", source=data_source)
app.add_url_rule("/data", "/data", self.serve, methods=['GET', 'OPTIONS', 'POST'])
def serve(self):
# load data from db and return JSON
...
return jsonify(
date_time= da.df["Date_Time"].tolist(),
value_1=da.df["Value1"].tolist(),
value_2=da.df["Value2"].tolist(),
value_3=da.df["Value3"].tolist()
)
date_time
ist die gemeinsame X-Achse, ist value_1
für Zeile 1, value_2
für Zeile 2, Zeile 3 für value_3
Das Problem
Warum wird AjaxDataSource
3-mal aufgerufen (sie sind ein paar Millisekunden auseinander, dann wird die Dreifachmessung nach 5 Sekunden erneut durchgeführt) statt nur einmal alle 5 Sekunden?
Ich glaubte, dass AjaxDataSource alle 5 Sekunden dynamisch data_source.data
füllt und dann, nachdem sie gelesen wurden, lesen die 3 Zeilen diese "jetzt statische" Daten.
Problemumgehung?
Gibt es eine Möglichkeit, die Daten mit AjaxDataSource zu lesen, die Daten automatisch in eine ColumnDataSource zu übertragen und diese als "statische" Datenquelle zu verwenden?
Oder fehlt mir hier etwas Wichtiges?
Die Problemumgehung funktioniert einwandfrei! Danke Eugene. –