RxPY - flat_map发射等待下一个发生器值

时间:2017-12-12 10:57:26

标签: python rxjs system.reactive reactive-programming rx-py

嗨!我正在尝试完成我的第一个RxPY项目,但是我遇到了一些问题 使Python中的flat_map行为不存在。

在这个项目中,有一个从生成器(Kafka消费者)创建的Observable。它在收到消息时发出值,然后根据消息执行查询,并为每个结果发出一个值。

我对代码进行了一些更改,以便更容易重现。 Kafka消费者被一个在发射之间花费大量时间的发生器取代,并且查询结果被发出3个值的Observable取代。 行为仍然是一样的。

from rx import Observable

generator = (i for i in range(100000000) if i == 0 or i == 50000000)
Observable.from_(generator) \
    .flat_map(lambda i: Observable.from_(['a', 'b', 'c'])) \
    .subscribe(on_next=lambda i: print(i))

输出:

a
(...waits a long time...)
b
a
(...waits a long time...)
c
b
c

我期待这样的事情:

a
b
c
(...waits a long time...)
a
b
c

这种行为的原因是什么? 我该怎么做才能得到预期的结果?

谢谢! :)

1 个答案:

答案 0 :(得分:0)

最近在 flat_map 操作符和 ImmediateScheduler 中遇到了同样的问题。

为 RxPy 3 更新了一点初始代码:

import rx
from rx.operators import flat_map


generator = (i for i in range(100000000) if i == 0 or i == 50000000)
rx.from_(generator).pipe(
    flat_map(
        lambda i: rx.from_(['a', 'b', 'c'])
    )
).subscribe(on_next=lambda i: print(i))

输出略有不同,但问题是相同的:

(... waits a long time ...)
a
b
c
a
b
c

为 flat_map 中的 observable 应用 ImmediateScheduler:

import rx
from rx.operators import flat_map
from rx.scheduler import ImmediateScheduler


generator = (i for i in range(100000000) if i == 0 or i == 50000000)
rx.from_(generator).pipe(
    flat_map(
        lambda i: rx.from_(['a', 'b', 'c'], scheduler=ImmediateScheduler())
    )
).subscribe(on_next=lambda i: print(i))

并得到了预期的结果:

a
b
c
(...waits a long time...)
a
b
c