【问题标题】:Why repeat(n) does not work with create in Reactive extensions为什么重复(n)不适用于反应式扩展中的创建
【发布时间】:2016-09-08 22:25:58
【问题描述】:
from rx import Observable, Observer
from __future__ import print_function
import random

def create_observable(observer):
    while True:
        observer.on_next(random.randint(1,100))    

Observable.create(create_observable).take_while(lambda x: x>50).repeat(6).subscribe(print)

给予

74 78 94 59 79 76

序列,而我希望每个数字会重复 6 次

所以“重复”永远不会对使用 create 方法创建的 observables 起作用。

【问题讨论】:

    标签: python reactivex rx-py


    【解决方案1】:

    贴出的代码得到 6 次在 [51, 100] 范围内的随机整数序列。

    试试

    (Observable.create(create_observable)
        .take_while(lambda x: x > 50)
        .select_many(lambda x: Observable.just(x).repeat(6))
        .subscribe(print))
    

    或者只是

    (Observable.create(create_observable)
        .take_while(lambda x: x > 50)
        .select_many(lambda v: [v] * 6)
        .subscribe(print))
    

    【讨论】:

      【解决方案2】:

      问题在于create 函数中的无限循环。每当您订阅此类 observable 时,它​​都会调用传递给 create 的函数,并且无法退出此循环。您的程序此时卡住了,没有进一步的代码执行。你没有提到,但我想你必须强行终止它。

      生成无限序列时,您必须在每次迭代后检查订阅是否有效。最简单、最安全的方法是使用Observable.generate() 函数:

      Observable.generate(random.randint(1, 100), 
                          lambda x: True,
                          lambda x: random.randint(1, 100),
                          lambda x: x) \
          .take_while(lambda x: x > 50) \
          .repeat(6) \
          .subscribe(print)
      

      【讨论】:

      • 你的代码打印
      • @AndrewMatuk Disposable 是 subscribe 方法返回的内容。我在生成器中输入了错误的初始值,take_while 没有通过,所以没有生成值。我已经修复了样本,并自己尝试过。 RxPY 中似乎有一个错误:github.com/ReactiveX/RxPY/issues/157
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2020-05-08
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多