异步流到嵌入式Bokeh服务器 [英] Asynchronous Streaming To Embedded Bokeh Server

查看:62
本文介绍了异步流到嵌入式Bokeh服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题: 我的python应用程序启动了Bokeh服务器,如本文所述:

The question: My python application starts a Bokeh server a described in this article:

http://matthewrocklin.com/blog/work/2017/06/28/simple-bokeh-server

现在,我想可视化在python应用程序中生成的流数据,该应用程序启动了bokeh服务器并将其异步推送到我的bokeh可视化中.这可能吗?怎么样?

now, I want to visualize streaming data, which is generated in the python application, which started the bokeh server and push it a asynchronously to my bokeh visualization. Is this possible? How?

推荐答案

是可以的.我认为最好的选择是拥有一个单独的线程来填充数据桶,另一方面,Bokeh定期更新功能(如您提到的示例)将访问该数据并将其流式传输到浏览器.请参阅下面的简单示例.但也请参阅有关更新的Bokeh文档.从线程中绘制数据.

Yes it is possible. I think the best option is to have a separate thread that fills the data-bucket and on the other side the Bokeh periodic update function (like in example you mentioned) that accesses that data and streams it to the browser. See this simple example below. But have also a look at Bokeh documentation about updating plot data from threads.

import random, time
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, ColumnDataSource
from threading import Thread

class BokehApp():
    plot_data = []
    last_data_length = None

    def __init__(self):
        thread = Thread(target = self.startDataAcquisition)
        thread.start()

        io_loop = IOLoop.current()
        server = Server(applications = {'/myapp': Application(FunctionHandler(self.make_document))}, io_loop = io_loop, port = 5001)
        server.start()
        server.show('/myapp')
        io_loop.start()

    def startDataAcquisition(self):
        while True:
            self.plot_data.append({'x': [random.random()], 'y': [random.random()], 'color': [random.choice(['red', 'blue', 'green'])]})
            time.sleep(5)

    def make_document(self, doc):
        source = ColumnDataSource({'x': [], 'y': [], 'color': []})
        fig = figure(title = 'Streaming Circle Plot!', sizing_mode = 'scale_both')
        fig.circle(source = source, x = 'x', y = 'y', color = 'color', size = 10)

        def update():
            if self.last_data_length is not None and self.last_data_length != len(self.plot_data):
                source.stream(self.plot_data[-1])
            self.last_data_length = len(self.plot_data)

        doc.add_root(fig)
        doc.add_periodic_callback(update, 1000)

if __name__ == '__main__':
    app = BokehApp()

这篇关于异步流到嵌入式Bokeh服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆