RxPy - 示例
在本章中,我们将详细讨论以下主题 -
- 基本示例展示了 observable、操作符和订阅观察者的工作原理。
- 可观察与主体之间的差异。
- 了解冷和热可观测值。
下面给出了一个基本示例,展示了可观察对象、运算符和订阅观察者的工作原理。
例子
测试.py
import requests import rx import json from rx import operators as ops def filternames(x): if (x["name"].startswith("C")): return x["name"] else : return "" content = requests.get('https://jsonplaceholder.typicode.com/users') y = json.loads(content.text) source = rx.from_(y) case1 = source.pipe( ops.filter(lambda c: filternames(c)), ops.map(lambda a:a["name"]) ) case1.subscribe( on_next = lambda i: print("Got - {0}".format(i)), 8. RxPy — Examples on_error = lambda e: print("Error : {0}".format(e)), on_completed = lambda: print("Job Done!"), )
这是一个非常简单的例子,其中,我从这个 URL 获取用户数据 -
https://jsonplaceholder.typicode.com/users。过滤数据,给出以“C”开头的名称,然后使用地图仅返回名称。这是相同的输出 -
E:\pyrx\examples>python test.py Got - Clementine Bauch Got - Chelsey Dietrich Got - Clementina DuBuque Job Done!
可观察与主体之间的差异
在这个例子中,我们将看到可观察对象和主题之间的区别。
from rx import of, operators as op import random test1 = of(1,2,3,4,5) sub1 = test1.pipe( op.map(lambda a : a+random.random()) ) print("From first subscriber") subscriber1 = sub1.subscribe(lambda i: print("From sub1 {0}".format(i))) print("From second subscriber") subscriber2 = sub1.subscribe(lambda i: print("From sub2 {0}".format(i)))
输出
E:\pyrx>python testrx.py From first subscriber From sub1 1.610450821095726 From sub1 2.9567564032037335 From sub1 3.933217537811936 From sub1 4.82444905626622 From sub1 5.929414892567188 From second subscriber From sub2 1.8573813517529874 From sub2 2.902433239469483 From sub2 3.2289868093016825 From sub2 4.050413890694411 From sub2 5.226515068012821
在上面的例子中,每次你订阅 observable 时,它都会给你新的值。
主题示例
from rx import of, operators as op import random from rx.subject import Subject subject_test = Subject() subject_test.subscribe( lambda x: print("From sub1 {0}".format(x)) ) subject_test.subscribe( lambda x: print("From sub2 {0}".format(x)) ) test1 = of(1,2,3,4,5) sub1 = test1.pipe( op.map(lambda a : a+random.random()) ) subscriber = sub1.subscribe(subject_test)
输出
E:\pyrx>python testrx.py From sub1 1.1789422863284509 From sub2 1.1789422863284509 From sub1 2.5525627903260153 From sub2 2.5525627903260153 From sub1 3.4191549324778325 From sub2 3.4191549324778325 From sub1 4.644042420199624 From sub2 4.644042420199624 From sub1 5.079896897489065 From sub2 5.079896897489065
如果您看到值在使用该主题的两个订阅者之间共享。
了解冷热观测值
可观察量被分类为
- 冷观测
- 热门观测值
当多个订阅者订阅时,可观察量的差异将会被注意到。
冷观测
冷可观察量是执行的可观察量,并在每次订阅时呈现数据。当它被订阅时,可观察对象被执行并给出新的值。
下面的例子给出了冷可观察的理解。
from rx import of, operators as op import random test1 = of(1,2,3,4,5) sub1 = test1.pipe( op.map(lambda a : a+random.random()) ) print("From first subscriber") subscriber1 = sub1.subscribe(lambda i: print("From sub1 {0}".format(i))) print("From second subscriber") subscriber2 = sub1.subscribe(lambda i: print("From sub2 {0}".format(i)))
输出
E:\pyrx>python testrx.py From first subscriber From sub1 1.610450821095726 From sub1 2.9567564032037335 From sub1 3.933217537811936 From sub1 4.82444905626622 From sub1 5.929414892567188 From second subscriber From sub2 1.8573813517529874 From sub2 2.902433239469483 From sub2 3.2289868093016825 From sub2 4.050413890694411 From sub2 5.226515068012821
在上面的示例中,每次订阅 observable 时,它都会执行 observable 并发出值。如上例所示,不同订阅者的值也可能不同。
热门观测值
在热可观察的情况下,它们会在准备好时发出值,并且不会总是等待订阅。当值被发出时,所有订阅者将获得相同的值。
当您希望在 observable 准备就绪时发出值,或者您希望向所有订阅者共享相同的值时,您可以使用热 observable。
热可观察的一个例子是主题和可连接运算符。
from rx import of, operators as op import random from rx.subject import Subject subject_test = Subject() subject_test.subscribe( lambda x: print("From sub1 {0}".format(x)) ) subject_test.subscribe( lambda x: print("From sub2 {0}".format(x)) ) test1 = of(1,2,3,4,5) sub1 = test1.pipe( op.map(lambda a : a+random.random()) ) subscriber = sub1.subscribe(subject_test)
输出
E:\pyrx>python testrx.py From sub1 1.1789422863284509 From sub2 1.1789422863284509 From sub1 2.5525627903260153 From sub2 2.5525627903260153 From sub1 3.4191549324778325 From sub2 3.4191549324778325 From sub1 4.644042420199624 From sub2 4.644042420199624 From sub1 5.079896897489065 From sub2 5.079896897489065
如果您看到,订阅者之间共享相同的值。您可以使用publish()连接可观察运算符来实现相同的目的。