RxPy with_latest_from产生不一致的结果

时间:2016-05-28 13:11:42

标签: python reactive-programming rx-py

我在group_by上使用Observable但是对于每个新创建的组,我想捕捉导致使用{{{来创建组的元素(使用新密钥) 1}}:

with_latest_from

我希望看到以下两个内容都被打印出来,但每次都只看到其中任何一个。

>>> from __future__ import print_function
>>> from rx import Observable

>>> # sequence 1, 2, 3, ... every half a second
>>> observable=Observable.interval(500).map(lambda x: x + 1)

>>> # groups into numbers that are divisible by 3 (True) and those that are not (False)
>>> grouped = observable.group_by(lambda x: bool(x%3))

>>> # groups paired with the first element that kicked off the group
>>> grouped.with_latest_from(observable, lambda group, element: (group, element)).subscribe(print)

在奇怪的场合,我也看到了snapped元素为2:

(<rx.linq.groupedobservable.GroupedObservable object at 0xabc>, 1)  # 1 is the element that created group with key=False
(<rx.linq.groupedobservable.GroupedObservable object at 0xdef>, 3)  # 3 is the element that created group with key=True

任何想法出了什么问题?

1 个答案:

答案 0 :(得分:0)

来自Dag Brattli

  

问题似乎是你基本上在自己的流上使用with_latest_from()。因此,如果源或最新将首先触发,则没有保证。如果在新组的源之前发生最新触发,那么它将丢失。解决这个问题的方法是在每个组中获取第一个元素的单独流,并使用组流来压缩它:

# A stream with the first element if each group
firsts = grouped.flat_map(lambda group: group.first())

# groups paired with the first element that kicked off the group
grouped.zip(firsts, lambda g, k: (g, k)).subscribe(print)
  

另请注意,每个组还包含模数运算符结果的键,如果可以使用该键而不是元素:

grouped.map(lambda gr: (gr, gr.key)).subscribe(print)