我是RxJava的新手 - 通过阅读https://github.com/Froussios/Intro-To-RxJava开始学习,然后继续阅读 What's different in 2.0了解RxJava2的不同之处。
然后,我尝试了Backpressure (2.0)部分中提到的第一个示例,并按预期获得了MissingBackpressureException
异常。然而,我再次尝试相同的例子,但使用Observable
(Kotlin代码) -
val valueProducer = PublishProcessor.create<Int>() // an ObservableSource
valueProducer
.observeOn(Schedulers.computation())
.map { Thread.sleep(500); it } // slow computation
.forEach(::println)
(0..10_000_000).forEach(valueProducer::onNext) // push 10M values
println("10M values pushed!") // this succeeds
Thread.sleep(1_000_000) // just hang around & notice values being printed every second
我的问题是,当Observable and Flowable
的笔记提到io.reactivex.Observable
是“非背压”时,这究竟是什么意思? 10M值在上面的代码中保存在哪里?
答案 0 :(得分:0)
io.reactivex.Observable
是“非反压”意味着如果您的数据源过于频繁地发送项目,并且您的订阅者没有时间处理它 - >将跳过部分数据。 io.reactivex.Flowable
支持背压,这意味着它有通知数据源的方法“好的,我完成了这部分数据,再给我一个”,数据不会丢失。
答案 1 :(得分:0)
Backpressure意味着发布者和订阅者互相交谈,让订阅者知道他可以继续处理管道中的项目。
&#xA;&#xA;如果你不喜欢有那些背压操作员。
&#xA;&#xA; &#xA;&#xA;然后,您的订阅者可能会开始累积越来越多的项目而没有足够的时间来处理,并且您的系统中最终会出现内存不足。
&#xA;&#xA;我建议你先阅读一下背压。
&#xA;&#xA; &#xA;