日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺談Python響應式類庫RxPy

瀏覽:28日期:2022-06-16 18:36:53
目錄一、基本概念1.1、Observable和Observer(可觀察對象和觀察者)1.2、Operator(操作符)1.3、Single(單例)1.4、Subject(主體)1.5、Scheduler(調度器)1.6、Observer和Observable1.7、操作符1.8、創建型操作符1.9、過濾型操作符1.10、轉換型操作符1.11、算術操作符1.12、Subject1.13、ReplaySubject1.14、BehaviorSubject1.15、AsyncSubject1.16、Scheduler二、應用場景2.1、防止重復發送2.2、操作數據流一、基本概念

Reactive X中有幾個核心的概念,先來簡單介紹一下。

1.1、Observable和Observer(可觀察對象和觀察者)

首先是Observable和Observer,它們分別是可觀察對象和觀察者。Observable可以理解為一個異步的數據源,會發送一系列的值。Observer則類似于消費者,需要先訂閱Observable,然后才可以接收到其發射的值??梢哉f這組概念是設計模式中的觀察者模式和生產者-消費者模式的綜合體。

1.2、Operator(操作符)

另外一個非常重要的概念就是操作符了。操作符作用于Observable的數據流上,可以對其施加各種各樣的操作。更重要的是,操作符還可以鏈式組合起來。這樣的鏈式函數調用不僅將數據和操作分隔開來,而且代碼更加清晰可讀。一旦熟練掌握之后,你就會愛上這種感覺的。

1.3、Single(單例)

在RxJava和其變體中,還有一個比較特殊的概念叫做Single,它是一種只會發射同一個值的Observable,說白了就是單例。當然如果你對Java等語言比較熟悉,那么單例想必也很熟悉。

1.4、Subject(主體)

主體這個概念非常特殊,它既是Observable又是Observer。正是因為這個特點,所以Subject可以訂閱其他Observable,也可以將發射對象給其他Observer。在某些場景中,Subject會有很大的作用。

1.5、Scheduler(調度器)

默認情況下Reactive X只運行在當前線程下,但是如果有需要的話,也可以用調度器來讓Reactive X運行在多線程環境下。有很多調度器和對應的操作符,可以處理多線程場景下的各種要求。

1.6、Observer和Observable

先來看看一個最簡單的例子,運行的結果會依次打印這些數字。這里的of是一個操作符,可以根據給定的參數創建一個新的Observable。創建之后,就可以訂閱Observable,三個回調方法在對應的時機執行。一旦Observer訂閱了Observable,就會接收到后續Observable發射的各項值。

from rx import ofob = of(1, 2, 34, 5, 6, 7, 7)ob.subscribe( on_next=lambda i: print(f’Received: {i}’), on_error=lambda e: print(f’Error: {e}’), on_completed=lambda: print(’Completed’))

這個例子看起來好像很簡單,并且看起來沒什么用。但是當你了解了Rx的一些核心概念,就會理解到這是一個多么強大的工具。更重要的是,Observable生成數據和訂閱的過程是異步的,如果你熟悉的話,就可以利用這個特性做很多事情。

1.7、操作符

在RxPy中另一個非常重要的概念就是操作符了,甚至可以說操作符就是最重要的一個概念了。幾乎所有的功能都可以通過組合各個操作符來實現。熟練掌握操作符就是學好RxPy的關鍵了。操作符之間也可以用pipe函數連接起來,構成復雜的操作鏈。

from rx import of, operators as opimport rxob = of(1, 2, 34, 5, 6, 7, 7)ob.pipe( op.map(lambda i: i ** 2), op.filter(lambda i: i >= 10)).subscribe(lambda i: print(f’Received: {i}’))

在RxPy中有大量操作符,可以完成各種各樣的功能。我們來簡單看看其中一些常用的操作符。如果你熟悉Java8的流類庫或者其他函數式編程類庫的話,應該對這些操作符感到非常親切。

1.8、創建型操作符

首先是創建Observable的操作符,列舉了一些比較常用的創建型操作符。

淺談Python響應式類庫RxPy

1.9、過濾型操作符

過濾型操作符的主要作用是對Observable進行篩選和過濾。

淺談Python響應式類庫RxPy

1.10、轉換型操作符

淺談Python響應式類庫RxPy

1.11、算術操作符

淺談Python響應式類庫RxPy

1.12、Subject

Subject是一種特殊的對象,它既是Observer又是Observable。不過這個對象一般不太常用,但是假如某些用途還是很有用的。所以還是要介紹一下。下面的代碼,因為訂閱的時候第一個值已經發射出去了,所以只會打印訂閱之后才發射的值。

from rx.subject import Subject, AsyncSubject, BehaviorSubject, ReplaySubject# Subject同時是Observer和Observableprint(’--------Subject---------’)subject = Subject()subject.on_next(1)subject.subscribe(lambda i: print(i))subject.on_next(2)subject.on_next(3)subject.on_next(4)subject.on_completed()# 2 3 4

另外還有幾個特殊的Subject,下面來介紹一下。

1.13、ReplaySubject

ReplaySubject是一個特殊的Subject,它會記錄所有發射過的值,不論什么時候訂閱的。所以它可以用來當做緩存來使用。ReplaySubject還可以接受一個bufferSize參數,指定可以緩存的最近數據數,默認情況下是全部。

下面的代碼和上面的代碼幾乎完全一樣,但是因為使用了ReplaySubject,所以所有的值都會被打印。當然大家也可以試試把訂閱語句放到其他位置,看看輸出是否會產生變化。

# ReplaySubject會緩存所有值,如果指定參數的話只會緩存最近的幾個值print(’--------ReplaySubject---------’)subject = ReplaySubject()subject.on_next(1)subject.subscribe(lambda i: print(i))subject.on_next(2)subject.on_next(3)subject.on_next(4)subject.on_completed()# 1 2 3 41.14、BehaviorSubject

BehaviorSubject是一個特殊的Subject,它只會記錄最近一次發射的值。而且在創建它的時候,必須指定一個初始值,所有訂閱它的對象都可以接收到這個初始值。當然如果訂閱的晚了,這個初始值同樣會被后面發射的值覆蓋,這一點要注意。

# BehaviorSubject會緩存上次發射的值,除非Observable已經關閉print(’--------BehaviorSubject---------’)subject = BehaviorSubject(0)subject.on_next(1)subject.on_next(2)subject.subscribe(lambda i: print(i))subject.on_next(3)subject.on_next(4)subject.on_completed()# 2 3 41.15、AsyncSubject

AsyncSubject是一個特殊的Subject,顧名思義它是一個異步的Subject,它只會在Observer完成的時候發射數據,而且只會發射最后一個數據。因此下面的代碼僅僅會輸出4.假如注釋掉最后一行co_completed調用,那么什么也不會輸出。

# AsyncSubject會緩存上次發射的值,而且僅會在Observable關閉后開始發射print(’--------AsyncSubject---------’)subject = AsyncSubject()subject.on_next(1)subject.on_next(2)subject.subscribe(lambda i: print(i))subject.on_next(3)subject.on_next(4)subject.on_completed()# 41.16、Scheduler

雖然RxPy算是異步的框架,但是其實它默認還是運行在單個線程之上的,因此如果使用了某些會阻礙線程運行的操作,那么程序就會卡死。當然針對這些情況,我們就可以使用其他的Scheduler來調度任務,保證程序能夠高效運行。

下面的例子創建了一個ThreadPoolScheduler,它是基于線程池的調度器。兩個Observable用subscribe_on方法指定了調度器,因此它們會使用不同的線程來工作。

import rxfrom rx.scheduler import ThreadPoolSchedulerfrom rx import operators as opimport multiprocessingimport timeimport threadingimport randomdef long_work(value): time.sleep(random.randint(5, 20) / 10) return valuepool_schedular = ThreadPoolScheduler(multiprocessing.cpu_count())rx.range(5).pipe( op.map(lambda i: long_work(i + 1)), op.subscribe_on(pool_schedular)).subscribe(lambda i: print(f’Work 1: {threading.current_thread().name}, {i}’))rx.of(1, 2, 3, 4, 5).pipe( op.map(lambda i: i * 2), op.subscribe_on(pool_schedular)).subscribe(lambda i: print(f’Work 2: {threading.current_thread().name}, {i}’))

如果你觀察過各個操作符的API的話,可以發現大部分操作符都支持可選的Scheduler參數,為操作符指定一個調度器。如果操作符上指定了調度器的話,會優先使用這個調度器;其次的話,會使用subscribe方法上指定的調度器;如果以上都沒有指定的話,就會使用默認的調度器。

二、應用場景

好了,介紹了一些Reactive X的知識之后,下面來看看如何來使用Reactive X。在很多應用場景下,都可以利用Reactive X來抽象數據處理,把概念簡單化。

2.1、防止重復發送

很多情況下我們都需要控制事件的發生間隔,比如有一個按鈕不小心按了好幾次,只希望第一次按鈕生效。這種情況下可以使用debounce操作符,它會過濾Observable,小于指定時間間隔的數據會被過濾掉。debounce操作符會等待一段時間,直到過了間隔時間,才會發射最后一次的數據。如果想要過濾后面的數據,發送第一次的數據,則要使用throttle_first操作符。

下面的代碼可以比較好的演示這個操作符,快速按回車鍵發送數據,注意觀察按鍵和數據顯示之間的關系,還可以把throttle_first操作符換成debounce操作符,然后再看看輸出會發生什么變化,還可以完全注釋掉pipe中的操作符,再看看輸出會有什么變化。

import rxfrom rx import operators as opfrom rx.subject import Subjectimport datetime# debounce操作符,僅在時間間隔之外的可以發射ob = Subject()ob.pipe( op.throttle_first(3) # op.debounce(3)).subscribe( on_next=lambda i: print(i), on_completed=lambda: print(’Completed’))print(’press enter to print, press other key to exit’)while True: s = input() if s == ’’:ob.on_next(datetime.datetime.now().time()) else:ob.on_completed()break2.2、操作數據流

如果需要對一些數據進行操作,那么同樣有一大堆操作符可以滿足需求。當然這部分功能并不是Reactive X獨有的,如果你對Java 8的流類庫有所了解,會發現這兩者這方面的功能幾乎是完全一樣的。

下面是個簡單的例子,將兩個數據源結合起來,然后找出來其中所有的偶數。

import rxfrom rx import operators as opfrom rx.subject import Subjectimport datetime# 操作數據流some_data = rx.of(1, 2, 3, 4, 5, 6, 7, 8)some_data2 = rx.from_iterable(range(10, 20))some_data.pipe( op.merge(some_data2), op.filter(lambda i: i % 2 == 0), # op.map(lambda i: i * 2)).subscribe(lambda i: print(i))

再或者一個利用reduce的簡單例子,求1-100的整數和。

import rxfrom rx import operators as opfrom rx.subject import Subjectimport datetimerx.range(1, 101).pipe( op.reduce(lambda acc, i: acc + i, 0)).subscribe(lambda i: print(i))

以上就是淺談Python響應式類庫RxPy的詳細內容,更多關于Python響應式類庫RxPy的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产福利片在线观看| 成人看片网站| 日韩精品久久久久久久软件91| 久久香蕉国产| 一本大道色婷婷在线| 美女福利一区二区三区| 国产资源在线观看入口av| 色爱综合网欧美| 成人在线视频免费看| 久久精品影视| 久久久人人人| 日韩精品社区| sm捆绑调教国产免费网站在线观看| 日韩二区在线观看| 久久香蕉网站| 伊人久久大香线蕉av不卡| 亚洲自拍另类| 日韩精品1区2区3区| 久久亚洲视频| 久久国产精品亚洲77777| 欧美香蕉视频| 国产精品综合| 国产精品婷婷| 群体交乱之放荡娇妻一区二区| 精品视频97| 久久精品国产网站| 日韩欧美激情| 欧美日韩国产精品一区二区亚洲| 影院欧美亚洲| 伊人久久成人| 久久国产中文字幕| 老鸭窝一区二区久久精品| 亚洲精品在线二区| 日本欧美在线| 青青草91久久久久久久久| 中文一区一区三区免费在线观| 狠狠干成人综合网| 久久精品国产久精国产| 丝袜亚洲另类欧美| 在线 亚洲欧美在线综合一区| 在线综合欧美| 欧美永久精品| 久久中文字幕一区二区三区| 久久不卡日韩美女| 久久精品99久久无色码中文字幕| 蜜桃一区二区三区在线观看| 国产精东传媒成人av电影| 91精品xxx在线观看| 亚洲主播在线| 精品精品久久| 日韩视频二区| 麻豆视频观看网址久久| 国产精品videossex久久发布| 欧美亚洲日本精品| 蜜桃久久av一区| 国产一区一一区高清不卡| 精品1区2区3区4区| 国产精品久av福利在线观看| 亚洲黄色免费av| 六月婷婷一区| 国产福利片在线观看| 在线精品一区| 成人影视亚洲图片在线| 一本一本久久| 国产精品一级在线观看| 亚洲福利一区| 国产精品一区二区三区www| 久久久成人网| 国产日本亚洲| 黄色亚洲大片免费在线观看| 精品一区二区三区四区五区| 亚洲成人日韩| 精品网站999| 爽好久久久欧美精品| 91欧美在线| 国产乱人伦精品一区| 美日韩精品视频| 欧洲一区二区三区精品| 日韩av成人高清| 欧美+亚洲+精品+三区| 欧美激情亚洲| 亚洲18在线| 狠狠爱成人网| 国产网站在线| 国产欧美一区二区三区精品观看| 中文字幕在线视频网站| 蜜臀av性久久久久蜜臀aⅴ流畅| 另类专区亚洲| 亚洲精品黄色| 欧美特黄一区| 日本а中文在线天堂| 国产精品一在线观看| 午夜在线一区| 久久亚洲精品中文字幕蜜潮电影| 美女久久99| 欧美日韩国产一区二区在线观看| 99pao成人国产永久免费视频| 精品久久视频| 国产精品v日韩精品v欧美精品网站 | 日韩一区二区三区免费播放| 亚洲一区亚洲| 亚洲午夜久久久久久尤物| 国产精品麻豆久久| 麻豆成人在线观看| 欧美视频精品全部免费观看| 亚洲伊人影院| 亚洲一区成人| 在线精品小视频| 九九精品调教| 精品视频在线观看网站| 欧美亚洲二区| 欧美视频二区| 蜜桃视频一区二区| 99成人在线| 亚洲精品网址| 欧美一级鲁丝片| 国产精品二区不卡| 水蜜桃精品av一区二区| 精品免费视频| 国产一区二区精品福利地址| 久久久精品区| 精品国产精品国产偷麻豆| 久久影院资源站| 精品免费视频| 成人午夜毛片| 亚洲美女久久精品| 免费福利视频一区二区三区| 岛国av在线播放| 亚洲国产福利| 丁香六月综合| 精品一区二区三区免费看| 鲁大师精品99久久久| 国产精品欧美一区二区三区不卡 | 亚洲一卡久久| 午夜在线视频观看日韩17c| 久久亚洲图片| 波多野结衣一区| 日韩一区二区免费看| 狠狠爱成人网| 手机精品视频在线观看| 亚洲毛片在线免费| 日韩在线观看不卡| 亚洲一本视频| 99re国产精品| 国产亚洲激情| 亚洲午夜久久| 日韩av中文字幕一区| 人人爱人人干婷婷丁香亚洲| 国产日产一区| 91欧美在线| 亚洲欧洲一区| 亚洲开心激情| 久久97视频| 国内精品福利| 日韩一区中文| 国产精品.xx视频.xxtv| 一区二区精品伦理...| 亚洲一级网站| 亚洲在线久久| 日韩av一二三| 免费视频一区二区三区在线观看 | 在线观看亚洲精品福利片| 亚洲精品一二| 国产精品s色| 日韩毛片在线| 亚洲一区二区免费在线观看| 国产日韩欧美一区二区三区在线观看| 精品亚洲免a| 亚洲精品网址| 欧美日韩91| 日韩1区2区| 亚洲免费在线| 欧美激情网址| 午夜精品影院| 欧美视频久久| 久久影院一区| 欧美日韩1区| 欧美.日韩.国产.一区.二区 | 久久av一区| 美腿丝袜亚洲三区| 国产视频亚洲| 久久精品欧洲| 先锋影音国产一区| 免费在线亚洲欧美| 欧美一区二区三区激情视频| 婷婷精品久久久久久久久久不卡| 卡一卡二国产精品| 99pao成人国产永久免费视频| 国产精品久久亚洲不卡| 99久久九九| 日韩不卡在线观看日韩不卡视频| 国产中文字幕一区二区三区| 先锋亚洲精品| 色婷婷色综合| 日韩1区2区3区| 激情婷婷亚洲| 麻豆国产一区| 亚洲专区视频| 99xxxx成人网| 国产精品欧美三级在线观看|