在Bokeh服务器中使用x_range.on_change时处理慢回调函数

时间:2016-01-21 18:53:15

标签: python callback bokeh

当轴范围发生变化时,我尝试使用回调函数在Bokeh服务器图中生成新数据。原则上这很好用:我使用p.x_range.on_change('end', my_callback_function)将必要的函数附加到绘图中,执行my_callback_function并更新绘图。

我面临的问题是回调函数可能需要很长时间才能完成。如果用户在my_callback_function仍在运行时平移绘图或缩放几个步骤,则会触发更多on_change个事件,并且对my_callback_function的新调用会堆积起来。在用户停止平移或缩放后,这会导致绘图更新很长时间。

如果执行新的调用,有没有办法取消执行回调函数?或者是否可以指定一次只能对回调函数进行一次调用?

我尝试在功能运行时通过在p.x_range.remove_on_change('end', my_callback_function)开头设置my_callback_function来停用回叫,但显然在调用my_callback_function之前不会发生停用完成:新的电话仍在堆积。

以下是一个小例子:将其保存为test.py并使用bokeh serve test.py --show执行

import bokeh.plotting
import numpy
import time

def generate_data(start, end):
    time.sleep(1)
    newx = numpy.linspace(start + 0.1 * (end - start), end - 0.1 * (end - start), 10)
    newy = numpy.random.rand(10)
    return newx, newy

def my_callback_function(param, old, new):
    # I tried deactivating the callback once it's running...
    # p.x_range.remove_on_change('end', my_callback_function)
    x, y = generate_data(p.x_range.start, p.x_range.end)
    ds.data = {
        'x': x,
        'y': y
    }
    # ... and activating it again when done, but that doesn't work, the function calls still pile up
    # p.x_range.on_change('end', my_callback_function)

x, y = generate_data(0, 10)

p = bokeh.plotting.figure(x_range=[0, 10])
l = p.line(x, y)
ds = l.data_source

p.x_range.on_change('end', my_callback_function)

bokeh.plotting.curdoc().add_root(p)

0 个答案:

没有答案