我正在尝试制作一个散景图,该散景图在接收数据时会随时更新。我正在使用add_next_tick_callback(listener)
来获取使用curl "http://localhost:5006/mviz/?vpom=0.9&rpom=0.9"
查询发布的数据。使用curl发送时可以正确读取数据,但是
source.stream
时,浏览器中的绘图不会更新。source.data
上。但是,即使多次按下上述curl
命令,它每次也只会打印相同数量的行(只有四行,初始化时会在三行中追加一个新行)。以下是我在文件mviz.py
中拥有的脚本,该脚本是通过使用Bokeh版本1.0.4调用bokeh serve mviz.py
来运行的:
from bokeh.layouts import column
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc
from bokeh.server.server import Server
source = ColumnDataSource({"vpom": [0.1, 0.2, 0.3], "rpom": [0.2, 0.3, 0.4]})
fig = figure(title='Streaming Circle Plot!', sizing_mode='scale_width',
x_range=[0, 1], y_range=[0, 1])
fig.circle(source=source, x='vpom', y='rpom', size=10)
curdoc().add_root(column(fig))
curdoc().title = "Now with live updating!"
def listener():
req = curdoc().session_context
if req is not None:
args = req.request.arguments
print "recv", args
if args:
source.stream({k:map(float,v) for k,v in args.items()}, 100)
print source.data
curdoc().add_next_tick_callback(listener)
有人可以指出上面脚本的问题并发表评论,如果这是在该用例中使用Boekh的正确方法。
答案 0 :(得分:1)
此方法存在一些问题/误解:
每次向Bokeh服务器发出请求时,都会创建一个Session
以及该会话的Document
。 Document
是Bokeh服务器自动在Python和JS保持同步的所有对象(图形,小部件等)的集合。该文档来自何处? 执行该应用代码以生成它。重申一下另一种方法:每次建立连接时重新运行应用代码。
直接的后果是,按照书面规定,使用上述代码在HTTP请求之间根本不会“持久”或“累积”任何内容。每个新连接都是空白。整个应用程序代码都会在每个新的连接上运行,但是首先可以从外部数据存储中查找并加载任何先前的数据。
即使在将会话加载到浏览器之前,顶层的add_next_tick_callback
也将执行。没有必要将add_next_tick_callback
放在顶层(即,在其他按钮或小部件的回调代码之外),因为最终效果与将代码放在顶层的回调函数中是相同的。它可以在没有任何东西击中用户的浏览器之前完成运行。
那么您将如何实现这样的目标?
如果您真的只想使用查询参数访问Bokeh应用程序URL,则您的应用程序代码需要明确负责保存和加载请求之间的状态。它可以在它读/写的平面文件中,也可以通过它连接到的某个外部数据库存储。
或者,您可以embed the Bokeh serve as a library,在这种情况下,您可以将自己的新端点的新请求处理程序添加到基础Tornado应用程序中。这些处理程序可以持久/累积状态(在Bokeh服务器运行时)。如何将更新推送/传达到任何现有的开放会话是一个涉及更多的问题,具体取决于您的要求。