2016-07-14 16 views
7

Ich habe Bokeh-Anwendung mit einem Slider-Widget, das den Slider.on_change Callback verwendet, um meine Grafiken zu aktualisieren. Die Slider-Updates kommen jedoch viel schneller, als meine Callback-Funktion verarbeiten kann. Daher brauche ich eine Möglichkeit, die eingehenden Änderungsanforderungen zu drosseln. Das Problem ist sehr prominent, da der Schieberegler beim Gleiten in den Callback ruft, während nur der letzte Schiebereglerwert (wenn der Benutzer die Maus freigibt) von Interesse ist.Throttling in Bokeh Anwendung

Wie könnte ich dieses Problem angehen?

Antwort

11

Ab Release 0.12 ist dies immer noch ein bisschen klobig zu erreichen, aber nicht unmöglich. Es gibt eine "mouseup" Richtlinie für Schieberegler, aber dies gilt derzeit nur für CustomJS Rückrufe. Wenn Sie jedoch, dass mit einer „falschen“ Datenquelle kombiniert wird, können wir kommunizieren und nur den letzten Wert auslösen:

from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.plotting import figure 
from bokeh.models.callbacks import CustomJS 
from bokeh.models.sources import ColumnDataSource 
from bokeh.models.widgets import Slider 

# this is the real callback that we want to happen on slider mouseup 
def cb(attr, old, new): 
    print("UPDATE", source.data['value']) 

# This data source is just used to communicate/trigger the real callback 
source = ColumnDataSource(data=dict(value=[])) 
source.on_change('data', cb) 

# a figure, just for example 
p = figure(x_range=(0,1), y_range=(0,1)) 

# add a slider with a CustomJS callback and a mouseup policy to update the source 
slider = Slider(start=1, end=10, value=1, step=0.1, callback_policy='mouseup') 
slider.callback = CustomJS(args=dict(source=source), code=""" 
    source.data = { value: [cb_obj.value] } 
""") 

curdoc().add_root(column(slider, p)) 

# make sure to add the source explicitly 
curdoc().add_root(source) 

Wie gesagt, das ist nicht ideal. Es gibt einige offene Feature-Anfragen, die diese Situation in Zukunft verbessern könnten. Allerdings ist das Team ziemlich klein, also wenn Sie die Möglichkeit haben, einen Beitrag zu leisten, zögern Sie bitte nicht, zu erreichen (nur neue Mitarbeiter können helfen, die Entwicklung neuer Funktionen zu beschleunigen)

+0

Danke für den Vorschlag. Wie wäre es, einen Worker-Thread zu erstellen, der die Graphen entsprechend dem zuletzt berichteten Wert aktualisiert? Oder würde das Thread-Sicherheitsprobleme einführen? Kann ich in diesem Fall einen Wiederholungstimer einrichten, mit dem ich die Grafiken aktualisieren kann? (nur einige Gedanken, weil ich länger andauernde Aufgaben vorhersehe, die nicht nur durch Aktualisierungen des Schiebereglers verursacht werden) – Emile

+1

Dies könnte wahrscheinlich funktionieren, aber Sie müssen die Abschnitte zum Benutzerhandbuch in [Aktualisieren von Threads] (http: // bokeh) lesen .pydata.org/de/0.12.0/docs/user_guide/server.html # updating-from-threads) – bigreddot

+0

Wurde dieses Problem in Bokeh 12.6 gelöst? – Thornhale