问题:我的 python 应用程序启动了一个 Bokeh 服务器,如本文所述:
http://matthewrocklin.com/blog/work/2017/06/28/simple-bokeh-server
现在,我想要可视化在 python 应用程序中生成的流数据,该应用程序启动了散景服务器并将其异步推送到我的散景可视化。这可能吗?如何?
对的,这是可能的。我认为最好的选择是有一个单独的线程来填充数据桶,而另一边的 Bokeh 定期更新函数(如您提到的示例)访问该数据并将其流式传输到浏览器。请参阅下面这个简单的示例。但也请查看有关从线程更新绘图数据的Bokeh 文档。
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()
Run Code Online (Sandbox Code Playgroud)