flatMap()上可观察到的调度程序会影响外部可观察到的调度程序吗?

活泼的

这似乎是一个愚蠢的问题,我已经进行了一些测试以查看其在实践中的工作方式,但是我希望看到它得到证实,并且如果可能的话,我想知道为什么在Observable方面合同及其实施,因为在我对Rx规则的理解中,这就像一个令人讨厌的漏洞。另外,如果您可以告诉我在哪里可以找到它,那么它将在以后帮助我自己回答这些问题。

如果我使用以下Observable:

Observable.range(0, 3)
          .observeOn(schedulerA)
          .flatMap(i -> Observable.just(i)
                                  .observeOn(schedulerB)
                                  .map(j -> -j))
          .doOnNext(i -> System.out.println(String.format("Got %d", i)))
          .subscribe()

然后,将.doOnNext(i -> System.out.println(String.format("Got %d", i)))schedulerA上执行运算符schedulerB,为什么有基于正式或规范的原因?

谢谢。

阿卡诺克德

无法保证将在哪个调度程序上doOnNext运行。以概率的方式可能是其中之一。

这样做的原因是,flatMap操作员使用高级的快速路径和工作窃取算法,该算法可以由任一线程触发,并且也可以执行另一线程的某些任务。

随着琐碎的内部Observable快速完成,有可能schedulerA仍在处理其订阅并检测到来自内部源的值可用,从而在同一schedulerA线程上发出它其他时候,schedulerA在处理Observable产生项目之前完成内部处理在这种情况下,schedulerB将触发内部的发射flatMap

通常,当您不确定哪个线程将处理您的时doOnNext,请始终observeOn在所需线程之前应用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章