Python RxPY-平面图排放等待下一个发电机值

Python RxPY-平面图排放等待下一个发电机值,python,rxjs,system.reactive,reactive-programming,rx-py,Python,Rxjs,System.reactive,Reactive Programming,Rx Py,你好我正试图完成我的第一个RxPY项目,但我遇到了一些问题 了解Python中平面映射的行为 在这个项目中,有一个从生成器(卡夫卡消费者)创建的可观察对象。它在收到消息时发出值,然后根据消息执行查询,并为每个结果发出值 我对代码做了一些修改,以便更容易复制。Kafka consumer被一个在两次发射之间花费大量时间的生成器所取代,查询结果被一个发射3个值的可观测值所取代。 行为还是一样 from rx import Observable generator = (i for i in ran

你好我正试图完成我的第一个RxPY项目,但我遇到了一些问题
了解Python中平面映射的行为

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

我对代码做了一些修改,以便更容易复制。Kafka consumer被一个在两次发射之间花费大量时间的生成器所取代,查询结果被一个发射3个值的可观测值所取代。 行为还是一样

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
b
c
(...waits a long time...)
a
b
c
这种行为的原因是什么? 我应该怎么做才能得到预期的结果


谢谢!:)

最近,平面地图操作员遇到了同样的问题,即时计划员在这里提供了帮助

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
可观察内部平面图的应用即时计划器:

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

看起来RxPY优先于排空发电机,并推迟使用flatMap向前推进,因为发电机是同步的,所以flatMap占据了控制权。这与输出模式相匹配:每当生成器发射一个元素或结束时,flatMap将前进一个元素['a','b','c']。你能描述一下你到底想做什么吗?您是想实现延迟,还是真的有一台运行时间如此之长的同步发电机?
a
b
c
(...waits a long time...)
a
b
c