Bokeh+Flask:多个 AjaxDataSource 调用
Bokeh+Flask: Multiple AjaxDataSource calls
散景对象是显示 3 条独立线的图形。
数据流式传输。 AjaxDataSource 调用每 5 秒更新一次数据,从数据库中读取最后一个数据。
这是精简版 class:
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 行读取这些 "now static" 数据。
解决方法?
有没有办法使用 AjaxDataSource 读取数据,自动将数据传输到 ColumnDataSource 并将其用作 "static" 数据源?
还是我遗漏了什么重要的东西?
问题是每个连接有远程数据源的字形都会尝试初始化数据源。在 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 包含在您的页面之后但在它初始化其文档之前。具体怎么做取决于你嵌入散景的方式。
散景对象是显示 3 条独立线的图形。
数据流式传输。 AjaxDataSource 调用每 5 秒更新一次数据,从数据库中读取最后一个数据。
这是精简版 class:
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 行读取这些 "now static" 数据。
解决方法?
有没有办法使用 AjaxDataSource 读取数据,自动将数据传输到 ColumnDataSource 并将其用作 "static" 数据源?
还是我遗漏了什么重要的东西?
问题是每个连接有远程数据源的字形都会尝试初始化数据源。在 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 包含在您的页面之后但在它初始化其文档之前。具体怎么做取决于你嵌入散景的方式。