RxPy-例
この章では、次のトピックについて詳しく説明します。
- オブザーバブル、オペレーターの動作、およびオブザーバーへのサブスクライブを示す基本的な例。
- 観測量と対象の違い。
- 冷たい観測量と熱い観測量を理解する。
以下に示すのは、observable、operatorsの動作、およびobserverへのサブスクライブを示す基本的な例です。
例
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
上記の例では、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
サブジェクトを使用している両方のサブスクライバー間で値が共有されていることがわかります。
コールドオブザーバブルとホットオブザーバブルを理解する
オブザーバブルは次のように分類されます
- 冷たい観測量
- ホットオブザーバブル
複数のサブスクライバーがサブスクライブしている場合、オブザーバブルの違いに気付くでしょう。
冷たい観測量
コールドオブザーバブルは、実行されるオブザーバブルであり、サブスクライブされるたびにデータをレンダリングします。サブスクライブされると、observableが実行され、新しい値が与えられます。
次の例は、寒冷観測量の理解を示しています。
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が実行され、値が出力されます。上記の例に示すように、値はサブスクライバーごとに異なる場合もあります。
ホットオブザーバブル
ホットオブザーバブルの場合、準備ができたときに値を出力し、サブスクリプションを常に待機するとは限りません。値が発行されると、すべてのサブスクライバーが同じ値を取得します。
オブザーバブルの準備ができたときに値を発行する場合、またはすべてのサブスクライバーに同じ値を共有する場合は、ホットオブザーバブルを利用できます。
ホットオブザーバブルの例は、サブジェクトおよび接続可能なオペレーターです。
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
表示されている場合、同じ値がサブスクライバー間で共有されています。公開()接続可能な監視可能な演算子を使用して同じことを実現できます。