私はBokehサーバを使用して、センサーから送られるオンラインデータをプロットしています。私はmultiprocessing.Process
サブクラスを書いて、センサからデータを読み込み、それをパイプを介して別のサブクラスに送ります。サブクラスは、Bokeh Figureを入力データで更新する必要があります。Bokehフィギュアをマルチプロセッシングプロセスから更新する
プロットする方法Process
パイプから非同期に読み取ってBokehにプロットしますか?
すでにinput_pipe
にデータを送信し、別のプロセスを想定し、Grapher
クラスを考えてみましょう:
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
に変更しようとすると、関数は実際に実行されますが、セッションは何も描画しません。
ここで問題が発生する可能性があるのは何ですか?コードは論理的に見えますが、このアプローチが失敗する可能性のあるドキュメントを使用することはできません。
ありがとうございました。