我正在尝试制作一个Bokeh图,每当它收到数据时都会更新。我使用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在这个用例中的正确方法,请有人指出上面脚本的问题并加以评论。在
这种方法存在一些问题/误解:
每次向Bokeh服务器发出请求时,都会为该会话创建一个}。
Session
,以及一个{Document
是Bokeh服务器在Python和JS之间自动保持同步的所有对象(绘图、小部件等)的集合。这份文件是从哪里来的?执行应用程序代码以生成它。重申另一种方式:每次建立连接时,应用程序代码都会重新运行。在一个直接的后果是,正如所写的,在使用上面的代码的HTTP请求之间,没有任何东西会“持续”或“积累”。每一个新的连接都是一张白纸。整个应用程序代码将在每次新连接时运行,但作为第一步,它可以首先从外部数据存储中查找并加载任何以前的数据。
顶层的
add_next_tick_callback
甚至在会话加载到浏览器之前就要执行。没有理由将add_next_tick_callback
放在顶层(即在其他按钮或小部件的回调代码之外),因为最终效果与将代码放在顶层的回调函数中是一样的。它在任何东西都没有进入用户浏览器之前就已经运行完毕。那么,你可以做些什么来实现这样的事情呢?在
如果您真的只想用查询参数来访问Bokeh应用程序URL,那么您的应用程序代码需要显式地负责保存和加载请求之间的状态。这可能是在一个平面文件中,它读/写,或通过一些外部数据库,它连接到。
或者,您可以embed the Bokeh serve as a library在这种情况下,您可以为自己的新端点添加新的请求处理程序到底层的Tornado应用程序。这些处理程序可以保存/累积状态(当Bokeh服务器正在运行时)。如何将更新推送到任何现有的开放会话是一个更复杂的问题,这取决于您的需求。
相关问题 更多 >
编程相关推荐