Python ColumnDataSource上的Bokeh流未更新绘图

Python ColumnDataSource上的Bokeh流未更新绘图,python,bokeh,Python,Bokeh,我正在尝试制作一个Bokeh图,每当它收到数据时就会更新。我正在使用add\u next\u tick\u callback(listener)通过使用curl”的查询获取发布的数据http://localhost:5006/mviz/?vpom=0.9&rpom=0.9“。使用curl发送时正确读取数据,但是 调用source.stream,浏览器中的绘图不会更新 在多次发送数据时,我希望它每次都将新数据追加到source.data,从而增加行数。但是,即使多次点击上面的curl命令,它每次也

我正在尝试制作一个Bokeh图,每当它收到数据时就会更新。我正在使用
add\u next\u tick\u 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服务器发出请求时,都会创建一个
      会话
      ,以及该会话的
      文档
      文档
      是Bokeh服务器在Python和JS之间自动保持同步的所有对象(绘图、小部件等)的集合。这份文件来自哪里?执行应用程序代码以生成它。重申另一种方式:每次建立连接时,应用程序代码都会重新运行

      一个直接的结果是,正如所写的那样,在使用上述代码的HTTP请求之间,没有任何东西会“持久”或“累积”。每一次新的联系都是一张白纸。整个应用程序代码将在每次新连接时运行,但作为第一步,它可以首先从外部数据存储中查找并加载任何以前的数据

    • 即使在将会话加载到浏览器中之前,顶层的
      add\u next\u tick\u回调也将执行。没有理由将
      add_next_tick_callback
      放在顶层(即,在其他按钮或小部件的回调代码之外),因为最终效果与将代码放在顶层回调函数中相同。它在任何东西进入用户浏览器之前就完成了运行

    那么,要实现这样的功能,您可能会做些什么呢

    • 如果您真的只想使用查询参数点击Bokeh应用程序URL,那么您的应用程序代码需要显式地负责在请求之间保存和加载状态。这可能是在它读/写的平面文件中,或者通过它连接的某个外部数据库

    • 或者,在这种情况下,您可以将自己的新端点的新请求处理程序添加到底层Tornado应用程序中。这些处理程序可以保存/累积状态(在Bokeh服务器运行时)。如何推送/传达任何现有开放会话的更新是一个更复杂的问题,这取决于您的需求