我正在使用散景服務器繪製從傳感器開始的在線數據。我寫了一個multiprocessing.Process
子類,它從傳感器讀取數據,然後通過管道將其傳送到另一個子類,該子類應使用傳入數據更新散景圖。更新來自多處理過程的散景圖
如何使繪圖Process
異步地從管道中讀取並將其繪製到Bokeh?
考慮Grapher
類,假設另一個進程已經將數據發送到input_pipe
:這裏
from multiprocessing import Process
from bokeh.client import push_session
from bokeh.models import ColumnDataSource
from bokeh.plotting import curdoc, figure
from functools import partial
class Grapher(Process):
def __init__(self, name, input_pipe):
super(Grapher, self).__init__(name=name, daemon=True)
self.input_pipe = input_pipe
self.doc = curdoc()
self.source = ColumnDataSource(dict(time=[], value=[])
self.fig = figure()
self.fig.line(source=self.source, x='time', y='value')
self.doc.add_root(self.fig)
self.session = push_session(self.doc) # To keep session updated.
def run(self):
while True:
time, value = self.input_pipe.recv()
self.doc.add_next_tick_callback(partial(self.update, time, value))
@gen.coroutine
def update(self, time, value):
self.source.stream(dict(time=[time], value=[value]))
代碼是從背景虛化文檔的example採納。另外我運行bokeh serve
,這樣curdoc()
有東西可以連接。從Bokeh服務器日誌中,我看到該連接在那裏。
但是,問題似乎是update
並沒有真正在while
循環的下一個勾號後執行。我可以通過在update
內添加日誌消息來檢查該消息,該消息從未打印出來。
如果我嘗試將add_next_tick_callback
更改爲update
調用,該函數確實運行,但會話不會繪製任何內容。
什麼會導致此問題?代碼看起來合乎邏輯,而且我無法在這種方法可能失敗的情況下使用文檔。
謝謝。