RxPy - Примеры
В этой главе мы подробно обсудим следующие темы -
- Базовый пример, показывающий работу наблюдаемого, операторов и подписку на наблюдателя.
- Разница между наблюдаемым и субъектом.
- Понимание холодных и горячих наблюдаемых.
Ниже приведен базовый пример, показывающий работу наблюдаемого, операторов и подписку на наблюдателя.
пример
test.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
В приведенном выше примере каждый раз, когда вы подписываетесь на наблюдаемое, он будет выдавать вам новые значения.
Пример темы
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
В приведенном выше примере каждый раз, когда вы подписываетесь на наблюдаемый объект, он будет выполнять наблюдаемое и выдавать значения. Значения также могут отличаться от подписчика к подписчику, как показано в примере выше.
Горячие наблюдаемые
В случае горячего наблюдаемого они будут выдавать значения, когда они будут готовы, и не всегда будут ждать подписки. Когда значения будут отправлены, все подписчики получат одно и то же значение.
Вы можете использовать hot observable, если хотите, чтобы значения испускались, когда наблюдаемый готов, или вы хотите поделиться теми же значениями со всеми своими подписчиками.
Примером горячих наблюдаемых являются операторы Subject и connectable.
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 ().