问题: 我的python应用程序启动了Bokeh服务器,如本文所述:
http://matthewrocklin.com/blog/work/2017/06/28/simple-bokeh-server
现在,我想可视化在python应用程序中生成的流数据,该应用程序启动了bokeh服务器并将其异步推送到我的bokeh可视化中。这可能吗?怎么样?
答案 0 :(得分:1)
是的,有可能。我认为最好的选择是拥有一个单独的线程来填充数据桶,另一方面,Bokeh定期更新功能(如您提到的示例)将访问该数据并将其流式传输到浏览器。请参见下面的简单示例。但也请参阅有关updating plot data from threads的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()