摘要:相對于最大的更新就是把對背壓問題的處理邏輯從中抽取出來產生了新的可觀察對象。由于基于發射的數據流,以及對數據加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運行效率要比慢得多。
背壓(backpressure)
當上下游在不同的線程中,通過Observable發射,處理,響應數據流時,如果上游發射數據的速度快于下游接收處理數據的速度,這樣對于那些沒來得及處理的數據就會造成積壓,這些數據既不會丟失,也不會被垃圾回收機制回收,而是存放在一個異步緩存池中,如果緩存池中的數據一直得不到處理,越積越多,最后就會造成內存溢出,這便是響應式編程中的背壓(backpressure)問題。
例如,運行以下代碼:
public void demo1() {
Observable .create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { int i = 0; while (true) { i++; e.onNext(i); } } }) .subscribeOn(Schedulers.newThread()) .observeOn(Schedulers.newThread()) .subscribe(new Consumer () { @Override public void accept(Integer integer) throws Exception { Thread.sleep(5000); System.out.println(integer); } }); }
創建一個可觀察對象Observable在Schedulers.newThread()的線程中不斷發送數據,而觀察者Observer在Schedulers.newThread()的另一個線程中每隔5秒接收打印一條數據。
運行后,查看內存使用如下:
由于上游通過Observable發射數據的速度大于下游通過Consumer接收處理數據的速度,而且上下游分別運行在不同的線程中,下游對數據的接收處理不會堵塞上游對數據的發射,造成上游數據積壓,內存不斷增加,最后便會導致內存溢出。
Flowable
既然在函數響應式編程中會產生背壓(backpressure)問題,那么在函數響應式編程中就應該有解決方案。
Rxjava2相對于Rxjava1最大的更新就是把對背壓問題的處理邏輯從Observable中抽取出來產生了新的可觀察對象Flowable。
在Rxjava2中,Flowable可以看做是為了解決背壓問題,在Observable的基礎上優化后的產物,與Observable不處在同一組觀察者模式下,Observable是ObservableSource/Observer這一組觀察者模式中ObservableSource的典型實現,而Flowable是Publisher與Subscriber這一組觀察者模式中Publisher的典型實現。
所以在使用Flowable的時候,可觀察對象不再是Observable,而是Flowable;觀察者不再是Observer,而是Subscriber。Flowable與Subscriber之間依然通過subscribe()進行關聯。
雖然在Rxjava2中,Flowable是在Observable的基礎上優化后的產物,Observable能解決的問題Flowable也都能解決,但是并不代表Flowable可以完全取代Observable,在使用的過程中,并不能拋棄Observable而只用Flowable。
由于基于Flowable發射的數據流,以及對數據加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運行效率要比Observable慢得多。
只有在需要處理背壓問題時,才需要使用Flowable。
由于只有在上下游運行在不同的線程中,且上游發射數據的速度大于下游接收處理數據的速度時,才會產生背壓問題;
所以,如果能夠確定:
1、上下游運行在同一個線程中,
2、上下游工作在不同的線程中,但是下游處理數據的速度不慢于上游發射數據的速度,
3、上下游工作在不同的線程中,但是數據流中只有一條數據
則不會產生背壓問題,就沒有必要使用Flowable,以免影響性能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72149.html
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:只發射一條單一的數據,或者一條異常通知,不能發射完成通知,其中數據與通知只能發射一個。觀察者可觀察對象對應的觀察者為方法等同于中的。沒有用來處理完成通知的方法示例三發射完成通知示例四發射異常通知 在Rxjava2中,Observale和Flowable都是用來發射數據流的,但是,我們在實際應用中,很多時候,需要發射的數據并不是數據流的形式,而只是一條單一的數據,或者一條完成通知,或者一...
閱讀 4160·2021-11-22 13:52
閱讀 2078·2021-09-22 15:12
閱讀 1121·2019-08-30 15:53
閱讀 3455·2019-08-29 17:12
閱讀 2190·2019-08-29 16:23
閱讀 1647·2019-08-26 13:56
閱讀 1772·2019-08-26 13:44
閱讀 1880·2019-08-26 11:56