RxJava并行化是否打破了可观察的合同?

时间:2015-10-19 02:23:09

标签: multithreading parallel-processing reactive-programming rx-java

Ben Christensen posted here目前在RxJava中实现并行性的最佳方法是创建另一个Observable并在调度程序上订阅它,如下所示。

streamOfItems.flatMap(item -> {
   doStuffWithItem(item).subscribeOn(Schedulers.io());
});

但是,Observable Contract表示只要呼叫不重叠,就可以多次呼叫onNext()呼叫。好吧,在上面的链接之后的其他链中的任何运算符现在都可以轻松地破坏该规则(除非它们明确地进行某种同步/序列化)。

我的印象是RxJava喜欢一次在一个线程上保留一个排放流,并在特定的运营商处从一个线程切换到另一个线程,但从不并行(如下所示)。

observeOn() thread     -------------------------Y----Y----Y-------------
subscribeOn() thread   ----X----X----X----X-----------------------------

采用并行方法,我理解图表可能看起来像这样,看起来很重叠。

par subscribeOn() thread 3    -------------------------Y-----Y---------------
par subscribeOn() thread 2    ---------------------------Y---Y---------------
par subscribeOn() thread 1    -------------------------Y-------------Y-------
initial subscribeOn() thread  ----X----X----X----X---------------------------

我是否误解了任何内容或作出了广泛的假设?并行性是否违反Observable合约?这是否会使它在某种程度上不受欢迎?

1 个答案:

答案 0 :(得分:3)

如果您使用标准运算符,则不会破坏Observable协定,因为无论何时发生并发操作,运算符都会序列化它们的输出。在您的示例中,flatMap执行此操作以确保其输出是顺序的(尽管接收线程可以来回切换)。

但是,如果相同管道的不同阶段由异步边界或可能进行线程仲裁的运算符分隔,则通常不会这样。