问题:我的python应用程序启动Bokeh服务器,如本文所述:
http://matthewrocklin.com/blog/work/2017/06/28/simple-bokeh-server
现在,我想要可视化在python应用程序中生成的流数据,该应用程序启动了bokeh服务器,并将其异步推送到我的bokeh可视化。这个是可能的吗?多么?
发布于 2019-03-15 11:02:30
是的,这是可能的。我认为最好的选择是有一个单独的线程来填充数据桶,另一边是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()
https://stackoverflow.com/questions/55176868
复制相似问题