2016-12-14 7 views
2

私は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に変更しようとすると、関数は実際に実行されますが、セッションは何も描画しません。

ここで問題が発生する可能性があるのは何ですか?コードは論理的に見えますが、このアプローチが失敗する可能性のあるドキュメントを使用することはできません。

ありがとうございました。

答えて

1

アプリへのアプローチを使用する場合、イベントを処理し、コールバックが発生したときに呼び出されるようにするには、ブロック機能session.loop_until_closed()を最後に呼び出す必要があります。イベントを監視し、コールバックを呼び出すためにイベントを監視し、コールバックを呼び出し、実際には周りにいることを保つことが、イベントの監視とコールバックの呼び出しです。

ブロッキング機能を呼び出すことは問題がある、とあなたはアプリのbokeh serve app.pyスタイルを使用したくない場合は、(100%でない、これは動作します)別のスレッドでsession.loop_until_closed()を呼び出してみたり、あなた自身のトルネードioloopを開始することができますその上にBokehサーバーアプリケーションをピギーバックします。その技術は、今後の0.12.4のリリースでよりよく立証されますが、このノートブックに今の便利な参照を見つけることがあります。そのノートブックは、コンセプトの証明であることを

https://gist.github.com/bryevdv/ff84871fcd843aceea4f0197be9c57e0

注意を、あなたは0.12.4のdevのリリースが必要になりますそれが機能するためには、使用の詳細の一部が変更される可能性があります。

関連する問題