Bokeh + Flask:多个AjaxDataSource调用

时间:2017-07-25 11:25:14

标签: python streaming bokeh

Bokeh对象是显示3条独立线条的图形。

数据流式传输。 AjaxDataSource调用每5秒更新数据,从数据库中读取最后一个数据。

这是精简课程:

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是常见的x轴,value_1用于第1行,value_2用于第2行,value_3用于第3行。

问题

为什么AjaxDataSource被调用3次(它们相隔几毫秒,然后在5秒后再次完成三次读取)而不是每5秒钟一次?

我相信AjaxDataSource每5秒动态填充data_source.data,然后,在读完之后,3行读取这些"现在静态"数据。

解决方法吗

有没有办法使用AjaxDataSource读取数据,自动将数据传输到ColumnDataSource并将其用作"静态"数据来源?

或者我错过了一些重要的东西?

1 个答案:

答案 0 :(得分:1)

问题是每个附加了远程数据源的字形都会尝试初始化数据源。在AjaxDataSource的情况下,它不会检查以前的初始化。

我为它开了一个问题:https://github.com/bokeh/bokeh/issues/6736

您可以尝试的临时解决方法:

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);
    }
}

确保在您的页面中包含Bokeh之后,但在初始化其文档之前运行此代码。怎么做取决于你如何嵌入Bokeh。