RxPY を使用して ReactiveX を GUI に統合しようとしています。これは ReactiveX に関する一般的な質問です。
を使用して複数の Observable ストリームに依存する視覚化があるとしますcombine_latest(stream1, stream2, plot_function)
。これは、ユーザーが値を変更したときなど、1 つの Observable が変更されたときにうまく機能します。新しい値を使用して視覚化が更新されます。ただし、ユーザーが単一のファイルから両方のストリームのデータをロードする場合など、両方の Observable が同時に更新されることがあります。技術的には、一方の Observable が他方の前に更新されます (インポート関数で最初に来る方)。その結果、プロットは 2 回更新されますが、すべての意図と目的のために 1 回だけ更新する必要があります。
私が持っているビジュアライゼーションの一部は計算にコストがかかるため、両方のストリームが同時に更新された場合、結合されたストリームが 1 つの値のみを出力するようにしたいと考えています。いくつかのオプションを考えることができます:
debounce()
結合されたストリームで短いタイムアウト (50 ミリ秒など) で使用します。このアプローチは私には汚いようです。combine_latest
直接使用しないでください。何らかのupdating
フラグを持つ新しいオブジェクトで 2 つのストリームをラップします。フラグを True に設定すると、フラグを Falseupdating
に設定するまで何も出力されません。updating
このアプローチはステートフルに感じられ、ストリームの構成可能性が損なわれます。すべてのストリームが更新されるまで、すべてのビジュアライゼーションを更新しないように指示します。繰り返しますが、可視化は上流で何が起こっているかを気にする必要がないため、カプセル化が壊れます。結合されたストリームから新しい値を受け取り、きれいな画像を作成するだけです。
ビジュアライゼーションを十分に細かくして、最初に 1 つのストリームを更新してもパフォーマンスがわずかに低下するだけにします。これは、ポイントとメッシュ サイズに基づいてメッシュを計算するビジュアライゼーションなど、一部のビジュアライゼーションでは不可能です。ポイントまたはメッシュ サイズが変更された場合、メッシュ全体を再計算する必要があります。
複数のストリームを「同時に」更新するための Rx の機能はありますか? 私が求めているのは魔法のような気がします。
Rx を使用して GUI プログラムを作成したことがある人へ: ストリームを介して新しい値を送信する以外に、モデルに使用すべきより良いアーキテクチャはありますか?
この質問が不明な場合は、コメントで教えてください。より具体的な例を作成しようとします。
例
サンプルの Python RxPY プログラムを次に示します。
import rx
stream1 = rx.subjects.BehaviorSubject(1)
stream2 = rx.subjects.BehaviorSubject(2)
rx.Observable\
.combine_latest(stream1, stream2, lambda x, y: (x, y))\
.subscribe(print)
stream1.on_next(3)
stream2.on_next(4)
これは以下を出力します:
(1, 2)
(3, 2)
(3, 4)
stream1
次の結果になるように、 と の値をstream2
同時に更新するにはどうすればよいですか?
(1, 2)
(3, 4)
言い換えれば、combine_latest
下流に「次の値を発行する前に他のストリームを更新する間、ちょっと待ってください」と伝えることができるように変更するにはどうすればよいでしょうか?