我正在尝试使用 RxPY 将 ReactiveX 集成到我的 GUI 中。这是一个通用的 ReactiveX 问题。
假设我有一个依赖于多个 Observable 流的可视化,使用combine_latest(stream1, stream2, plot_function)
. 当一个 Observable 发生变化时,这很有效,比如当用户修改一个值时;使用新值更新可视化。但是,有时两个 Observable 会同时更新,例如当用户从单个文件加载两个流的数据时。从技术上讲,一个 Observable 将在另一个之前更新(以导入函数中的先到者为准)。结果,情节将被更新两次,但出于所有意图和目的,它只需要更新一次。
我的一些可视化计算成本很高,所以我想确保如果两个流同时更新,那么组合流只发出一个值。我能想到几个选择:
在组合流上使用
debounce()
小超时(如 50 毫秒)。这种方法对我来说似乎很脏。不要
combine_latest
直接使用。将两个流包装在一个新对象中,该对象也具有某种updating
标志。如果我将标志设置为 True,那么在我将标志设置为 Falseupdating
之前不要发出任何内容。updating
这种方法感觉是有状态的,它破坏了流的可组合性。告诉所有可视化在所有流都更新之前不要更新。同样,这打破了封装,因为可视化不应该关心上游发生了什么。它应该只从组合流中接收新值并制作漂亮的图片。
使可视化足够细化,以至于首先更新一个流只会带来很小的性能损失。这对于某些可视化来说是不可能的,例如基于点和网格大小计算网格的可视化。如果点或网格大小发生变化,则需要重新计算整个网格。
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
以这样一种方式进行修改,以便我可以在下游告诉它“嘿,等一下,我会在你发出下一个值之前更新其他流”?