2017-07-25 5 views
0

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?

Antwort

1

Das Problem ist, dass jede Glyphe, an die eine ferne Datenquelle angeschlossen ist, versucht, die Datenquelle zu initialisieren. Im Fall von AjaxDataSource prüft es nicht auf vorherige Initialisierungen.

Ich habe ein Problem für sie geöffnet: https://github.com/bokeh/bokeh/issues/6736

Eine vorübergehende Lösung, die Sie könnten versuchen:

Bokeh.require('models/sources/ajax_data_source').AjaxDataSource.prototype.setup = function() { 
    this.get_data(this.mode); 
    if (this.polling_interval && this.interval == null) { 
     return this.interval = setInterval(this.get_data, this.polling_interval, this.mode, this.max_size, this.if_modified); 
    } 
} 

Vergewissern Sie sich, dass dieser Code richtig ausgeführt wird, nachdem Bokeh auf Ihrer Seite enthalten ist, aber bevor es seine Dokumente initialisiert. Wie es geht, hängt davon ab, wie Sie Bokeh einbetten.

+0

Die Problemumgehung funktioniert einwandfrei! Danke Eugene. –

Verwandte Themen