婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談Python響應式類庫RxPy

淺談Python響應式類庫RxPy

熱門標簽:聊城語音外呼系統 商家地圖標注海報 地圖標注自己和別人標注區別 孝感營銷電話機器人效果怎么樣 海外網吧地圖標注注冊 南陽打電話機器人 打電話機器人營銷 ai電銷機器人的優勢 騰訊地圖標注沒法顯示

一、基本概念

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

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

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

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 of

ob = 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 op
import rx

ob = 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的操作符,列舉了一些比較常用的創建型操作符。

1.9、過濾型操作符

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

1.10、轉換型操作符

1.11、算術操作符

1.12、Subject

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

from rx.subject import Subject, AsyncSubject, BehaviorSubject, ReplaySubject

# Subject同時是Observer和Observable

print('--------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 4

1.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 4

1.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()
# 4

1.16、Scheduler

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

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

import rx
from rx.scheduler import ThreadPoolScheduler
from rx import operators as op

import multiprocessing
import time
import threading
import random


def long_work(value):
    time.sleep(random.randint(5, 20) / 10)
    return value


pool_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 rx
from rx import operators as op
from rx.subject import Subject
import 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()
        break

2.2、操作數據流

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

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

import rx
from rx import operators as op
from rx.subject import Subject
import 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 rx
from rx import operators as op
from rx.subject import Subject
import datetime

rx.range(1, 101).pipe(
    op.reduce(lambda acc, i: acc + i, 0)
).subscribe(lambda i: print(i))

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

您可能感興趣的文章:
  • 超級好用的4個Python命令行可視化庫
  • Python中glob庫實現文件名的匹配
  • Python中jieba庫的使用方法
  • 學會Python數據可視化必須嘗試這7個庫
  • Python下opencv庫的安裝過程及問題匯總
  • 教你用Python matplotlib庫制作簡單的動畫
  • 總結幾個非常實用的Python庫

標簽:牡丹江 撫州 楊凌 聊城 揚州 迪慶 六盤水 南寧

巨人網絡通訊聲明:本文標題《淺談Python響應式類庫RxPy》,本文關鍵詞  淺談,Python,響應,式類,庫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談Python響應式類庫RxPy》相關的同類信息!
  • 本頁收集關于淺談Python響應式類庫RxPy的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美三级中文字幕在线观看| 久久久久久综合| 欧美日韩免费视频| 伊人色综合久久天天人手人婷| 成人深夜在线观看| 国产精品成人免费| 99久久精品免费| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 精品久久久久久久一区二区蜜臀| 亚洲综合在线观看视频| 欧美剧情片在线观看| 久草中文综合在线| 中文字幕一区二区三区不卡| 欧美午夜理伦三级在线观看| 久久se精品一区精品二区| 欧美激情在线一区二区| 一本高清dvd不卡在线观看| 亚洲h在线观看| 久久综合久久综合久久| 99精品在线观看视频| 日韩黄色一级片| 国产日韩精品一区二区浪潮av| 91在线视频18| 久88久久88久久久| 专区另类欧美日韩| 欧美一区二区三区四区高清 | 日本不卡不码高清免费观看| 国产性做久久久久久| 在线观看视频一区二区欧美日韩| 免费在线观看一区二区三区| 日韩欧美国产精品| 色综合激情五月| 青青国产91久久久久久| 亚洲欧美日韩人成在线播放| 欧美日韩国产小视频在线观看| 午夜精品成人在线| 精品国产凹凸成av人导航| 91免费小视频| 国产传媒欧美日韩成人| 亚洲另类春色校园小说| 久久久无码精品亚洲日韩按摩| 在线中文字幕一区二区| 成熟亚洲日本毛茸茸凸凹| 久久丁香综合五月国产三级网站| 亚洲视频免费看| 亚洲国产精品激情在线观看| 欧美精品一区二区在线播放| 欧美一区二区视频在线观看2020| 日本精品视频一区二区三区| 成人在线综合网站| 国产一区欧美二区| 久久99精品久久久| 免费成人在线视频观看| 亚洲一线二线三线久久久| 国产精品视频一二三| 久久综合色婷婷| 久久久国产精品午夜一区ai换脸| 欧美不卡在线视频| 777午夜精品视频在线播放| 在线影视一区二区三区| 一本一道久久a久久精品| 成人性生交大片免费看在线播放| 精品一区二区三区久久| 亚洲美女视频在线| 亚洲人成伊人成综合网小说| 中文字幕中文字幕一区二区| 中文字幕欧美国产| 国产精品久久久久影院老司| ...av二区三区久久精品| 中文字幕制服丝袜成人av| 精品国产电影一区二区| 日韩精品一区二区三区四区视频| 日韩午夜电影av| 欧美一区二区精品在线| 精品国产自在久精品国产| 久久久久一区二区三区四区| 国产亚洲短视频| 中文字幕成人网| 一区二区三区精品视频| 亚洲成人av中文| 久久精品国产精品亚洲精品| 国产美女在线精品| 99视频一区二区| 精品视频全国免费看| 欧美精品在欧美一区二区少妇 | www.欧美色图| 99re热视频精品| 在线看国产一区二区| 7777精品伊人久久久大香线蕉超级流畅| 欧美女孩性生活视频| 久久一区二区视频| 国产精品第一页第二页第三页| 亚洲免费观看高清完整版在线| 美女脱光内衣内裤视频久久网站| 国产精品自拍三区| 欧美三级电影精品| 久久久亚洲综合| 亚洲午夜免费电影| 国产成人在线视频网站| 欧美日韩色综合| 精品国产91久久久久久久妲己 | 国产精品萝li| 在线观看日韩精品| 亚洲精品一区在线观看| 综合久久久久久久| 全国精品久久少妇| 91极品视觉盛宴| 国产日韩精品一区二区浪潮av | 亚洲一区二区三区自拍| 美脚の诱脚舐め脚责91| 91丨porny丨最新| 日韩美女主播在线视频一区二区三区 | 国产亚洲精品超碰| 亚洲国产成人av网| 成人h动漫精品一区二区| 日韩午夜av一区| 午夜激情一区二区| 日本乱人伦一区| 综合在线观看色| 国产成人综合在线观看| 欧美一区二区美女| 日韩福利视频网| 欧美午夜片在线观看| 综合久久久久久| 成人高清视频在线| 久久久久久99精品| 日韩主播视频在线| 欧美日韩精品是欧美日韩精品| 日韩毛片视频在线看| 9人人澡人人爽人人精品| 国产午夜亚洲精品不卡| 麻豆高清免费国产一区| 欧美巨大另类极品videosbest| 亚洲线精品一区二区三区八戒| 91美女在线看| 亚洲六月丁香色婷婷综合久久| 不卡欧美aaaaa| 国产精品久久久久9999吃药| 国产成人精品一区二区三区网站观看| 精品国产一区二区三区不卡 | 不卡大黄网站免费看| 国产女人水真多18毛片18精品视频| 国内成人自拍视频| 亚洲国产精品传媒在线观看| 国产精品 欧美精品| 中文字幕不卡在线播放| 99热这里都是精品| 国产精品电影院| 99精品国产一区二区三区不卡| 亚洲色图一区二区三区| 成人免费看片app下载| 日韩理论电影院| av激情亚洲男人天堂| 香蕉久久夜色精品国产使用方法| 91福利资源站| 国内精品免费**视频| 亚洲欧美色一区| 色域天天综合网| 免费在线看成人av| 精品福利在线导航| 国产91丝袜在线18| 中文字幕不卡在线| 在线观看视频91| 久草在线在线精品观看| 日韩欧美国产wwwww| 99久久精品国产麻豆演员表| 亚洲综合激情小说| 666欧美在线视频| 国产成人高清在线| 亚洲欧美日韩中文字幕一区二区三区| 欧美日韩一区视频| 美女久久久精品| 亚洲国产精品成人久久综合一区 | 国产在线精品免费| 亚洲乱码国产乱码精品精可以看| 欧美吻胸吃奶大尺度电影 | 日韩专区欧美专区| 久久久美女毛片| 91黄色在线观看| 精品一区二区在线视频| 国产精品国产a级| 欧美大片在线观看一区| av网站免费线看精品| 日韩国产欧美在线播放| 国产欧美一区二区精品久导航 | 欧美国产欧美亚州国产日韩mv天天看完整| 91色在线porny| 久久精品久久精品| 国产精品国产三级国产aⅴ原创 | 亚洲国产视频直播| 久久久午夜精品理论片中文字幕| 99久久精品免费看国产免费软件| 美腿丝袜亚洲色图| 亚洲乱码国产乱码精品精的特点| 日韩免费在线观看| 色中色一区二区| 99久久精品一区二区| 激情成人综合网| 日日夜夜精品视频天天综合网| 国产欧美一区二区精品婷婷|