首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单个bokeh服务器不同的会话显示不同的流数据,如何解决?

单个bokeh服务器不同的会话显示不同的流数据,如何解决?
EN

Stack Overflow用户
提问于 2020-05-06 03:10:19
回答 1查看 294关注 0票数 2

我正在研究一个模拟的示波器,其中服务器PC收集数据,并最终在线发布流式绘图。下面是一个可以完成这项工作的工作脚本。但是,当我打开多个浏览器时,流式绘图显示不同的数据。(尽管它们使用相同的数据源)。示例'ohlc‘似乎也有同样的问题。那么,什么才是正确的方法呢?我正在考虑将数据写入文件,但这会带来一些问题,如文件i/o延迟和磁盘存储限制等。谢谢您的帮助。

代码语言:javascript
复制
from bokeh.server.server import Server
from bokeh.models import ColumnDataSource, Label
from bokeh.plotting import figure
from bokeh.layouts import column
import numpy as np
import datetime as dt
from functools import partial
import time


# this will be replaced with the real data collector in the end
def f_emitter(p=0.1):
    v = np.random.rand()
    return (dt.datetime.now(), 0. if v>p else v)


def make_document(doc, functions, labels):
    def update():
        for index, func in enumerate(functions):
            data = func()
            sources[index].stream(new_data=dict(time=[data[0]], data=[data[1]]), rollover=1000)
            annotations[index].text = f'{data[1]: .3f}'

    sources = [ColumnDataSource(dict(time=[], data=[])) for _ in range(len(functions))]
    figs = []
    annotations = []
    for i in range(len(functions)):
        figs.append(figure(x_axis_type='datetime',
                           y_axis_label=labels[i], toolbar_location=None,
                           active_drag=None, active_scroll=None))
        figs[i].line(x='time', y='data', source=sources[i])
        annotations.append(Label(x=10, y=10, text='', text_font_size='40px', text_color='black',
                                 x_units='screen', y_units='screen', background_fill_color='white'))
        figs[i].add_layout(annotations[i])
        # print(figs[i].plot_height)

    doc.add_root(column([fig for fig in figs], sizing_mode='stretch_both'))
    doc.add_periodic_callback(callback=update, period_milliseconds=100)


if __name__ == '__main__':
    # list of functions and labels to feed into the scope
    functions = [f_emitter]
    labels = ['emitter']

    server = Server({'/': partial(make_document, functions=functions, labels=labels)})
    server.start()
    server.io_loop.add_callback(server.show, "/")
    try:
        server.io_loop.start()
    except KeyboardInterrupt:
        print('keyboard interruption')
EN

回答 1

Stack Overflow用户

发布于 2020-05-06 03:32:04

当你连接一个新的客户端时,Bokeh默认会创建一个新的会话。每个会话都有自己的文档,因此数据源最终是不同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61621111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档