摘要:相對(duì)于最大的更新就是把對(duì)背壓問題的處理邏輯從中抽取出來產(chǎn)生了新的可觀察對(duì)象。由于基于發(fā)射的數(shù)據(jù)流,以及對(duì)數(shù)據(jù)加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運(yùn)行效率要比慢得多。
背壓(backpressure)
當(dāng)上下游在不同的線程中,通過Observable發(fā)射,處理,響應(yīng)數(shù)據(jù)流時(shí),如果上游發(fā)射數(shù)據(jù)的速度快于下游接收處理數(shù)據(jù)的速度,這樣對(duì)于那些沒來得及處理的數(shù)據(jù)就會(huì)造成積壓,這些數(shù)據(jù)既不會(huì)丟失,也不會(huì)被垃圾回收機(jī)制回收,而是存放在一個(gè)異步緩存池中,如果緩存池中的數(shù)據(jù)一直得不到處理,越積越多,最后就會(huì)造成內(nèi)存溢出,這便是響應(yīng)式編程中的背壓(backpressure)問題。
例如,運(yùn)行以下代碼:
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); } }); }
創(chuàng)建一個(gè)可觀察對(duì)象Observable在Schedulers.newThread()的線程中不斷發(fā)送數(shù)據(jù),而觀察者Observer在Schedulers.newThread()的另一個(gè)線程中每隔5秒接收打印一條數(shù)據(jù)。
運(yùn)行后,查看內(nèi)存使用如下:
由于上游通過Observable發(fā)射數(shù)據(jù)的速度大于下游通過Consumer接收處理數(shù)據(jù)的速度,而且上下游分別運(yùn)行在不同的線程中,下游對(duì)數(shù)據(jù)的接收處理不會(huì)堵塞上游對(duì)數(shù)據(jù)的發(fā)射,造成上游數(shù)據(jù)積壓,內(nèi)存不斷增加,最后便會(huì)導(dǎo)致內(nèi)存溢出。
Flowable
既然在函數(shù)響應(yīng)式編程中會(huì)產(chǎn)生背壓(backpressure)問題,那么在函數(shù)響應(yīng)式編程中就應(yīng)該有解決方案。
Rxjava2相對(duì)于Rxjava1最大的更新就是把對(duì)背壓問題的處理邏輯從Observable中抽取出來產(chǎn)生了新的可觀察對(duì)象Flowable。
在Rxjava2中,F(xiàn)lowable可以看做是為了解決背壓問題,在Observable的基礎(chǔ)上優(yōu)化后的產(chǎn)物,與Observable不處在同一組觀察者模式下,Observable是ObservableSource/Observer這一組觀察者模式中ObservableSource的典型實(shí)現(xiàn),而Flowable是Publisher與Subscriber這一組觀察者模式中Publisher的典型實(shí)現(xiàn)。
所以在使用Flowable的時(shí)候,可觀察對(duì)象不再是Observable,而是Flowable;觀察者不再是Observer,而是Subscriber。Flowable與Subscriber之間依然通過subscribe()進(jìn)行關(guān)聯(lián)。
雖然在Rxjava2中,F(xiàn)lowable是在Observable的基礎(chǔ)上優(yōu)化后的產(chǎn)物,Observable能解決的問題Flowable也都能解決,但是并不代表Flowable可以完全取代Observable,在使用的過程中,并不能拋棄Observable而只用Flowable。
由于基于Flowable發(fā)射的數(shù)據(jù)流,以及對(duì)數(shù)據(jù)加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運(yùn)行效率要比Observable慢得多。
只有在需要處理背壓問題時(shí),才需要使用Flowable。
由于只有在上下游運(yùn)行在不同的線程中,且上游發(fā)射數(shù)據(jù)的速度大于下游接收處理數(shù)據(jù)的速度時(shí),才會(huì)產(chǎn)生背壓問題;
所以,如果能夠確定:
1、上下游運(yùn)行在同一個(gè)線程中,
2、上下游工作在不同的線程中,但是下游處理數(shù)據(jù)的速度不慢于上游發(fā)射數(shù)據(jù)的速度,
3、上下游工作在不同的線程中,但是數(shù)據(jù)流中只有一條數(shù)據(jù)
則不會(huì)產(chǎn)生背壓問題,就沒有必要使用Flowable,以免影響性能。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72149.html
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
摘要:只發(fā)射一條單一的數(shù)據(jù),或者一條異常通知,不能發(fā)射完成通知,其中數(shù)據(jù)與通知只能發(fā)射一個(gè)。觀察者可觀察對(duì)象對(duì)應(yīng)的觀察者為方法等同于中的。沒有用來處理完成通知的方法示例三發(fā)射完成通知示例四發(fā)射異常通知 在Rxjava2中,Observale和Flowable都是用來發(fā)射數(shù)據(jù)流的,但是,我們?cè)趯?shí)際應(yīng)用中,很多時(shí)候,需要發(fā)射的數(shù)據(jù)并不是數(shù)據(jù)流的形式,而只是一條單一的數(shù)據(jù),或者一條完成通知,或者一...
閱讀 4186·2021-11-22 13:52
閱讀 2094·2021-09-22 15:12
閱讀 1133·2019-08-30 15:53
閱讀 3467·2019-08-29 17:12
閱讀 2198·2019-08-29 16:23
閱讀 1662·2019-08-26 13:56
閱讀 1778·2019-08-26 13:44
閱讀 1897·2019-08-26 11:56