RxPY-주제 작업

주제는 관찰 가능한 시퀀스 일뿐만 아니라 멀티 캐스트 할 수있는 관찰자입니다. 즉, 구독 한 많은 관찰자와 대화 할 수 있습니다.

주제에 대해 다음 주제를 논의 할 것입니다.

  • 주제 만들기
  • 주제 구독
  • 주제에 데이터 전달
  • BehaviorSubject
  • ReplaySubject
  • AsyncSubject

주제 만들기

주제로 작업하려면 아래와 같이 주제를 가져와야합니다.

from rx.subject import Subject

다음과 같이 주제 객체를 만들 수 있습니다.

subject_test = Subject()

객체는 세 가지 방법이있는 관찰자입니다.

  • on_next(value)
  • on_error (error) 및
  • on_completed()

주제 구독

다음과 같이 주제에 대해 여러 구독을 만들 수 있습니다.

subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)
subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)

주제에 데이터 전달

아래와 같이 on_next (value) 메서드를 사용하여 생성 된 주제에 데이터를 전달할 수 있습니다.

subject_test.on_next("A")
subject_test.on_next("B")

데이터는 주제에 추가 된 모든 구독으로 전달됩니다.

여기에 주제의 작동 예가 있습니다.

from rx.subject import Subject
subject_test = Subject()
subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)
subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)
subject_test.on_next("A")
subject_test.on_next("B")

subject_test 객체는 Subject ()를 호출하여 생성됩니다. subject_test 객체에는 on_next (value), on_error (error) 및 on_completed () 메서드에 대한 참조가 있습니다. 위 예의 출력은 다음과 같습니다.

산출

E:\pyrx>python testrx.py
The value is A
The value is A
The value is B
The value is B

on_completed () 메서드를 사용하여 아래와 같이 주제 실행을 중지 할 수 있습니다.

from rx.subject import Subject
subject_test = Subject()
subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)
subject_test.subscribe(
   lambda x: print("The value is {0}".format(x))
)
subject_test.on_next("A")
subject_test.on_completed()
subject_test.on_next("B")

complete를 호출하면 나중에 호출되는 다음 메서드가 호출되지 않습니다.

산출

E:\pyrx>python testrx.py
The value is A
The value is A

이제 on_error (error) 메서드를 호출하는 방법을 살펴 보겠습니다.

from rx.subject import Subject
subject_test = Subject()
subject_test.subscribe(
   on_error = lambda e: print("Error : {0}".format(e))
)
subject_test.subscribe(
   on_error = lambda e: print("Error : {0}".format(e))
)
subject_test.on_error(Exception('There is an Error!'))

산출

E:\pyrx>python testrx.py
Error: There is an Error!
Error: There is an Error!

행동 주제

BehaviorSubject는 호출시 최신 값을 제공합니다. 아래와 같이 행동 주제를 만들 수 있습니다.

from rx.subject import BehaviorSubject
behavior_subject = BehaviorSubject("Testing Behaviour Subject"); // initialized the behaviour subject with value:Testing Behaviour Subject

다음은 Behavior Subject를 사용하는 작업 예제입니다.

from rx.subject import BehaviorSubject
behavior_subject = BehaviorSubject("Testing Behaviour Subject");
behavior_subject.subscribe(
   lambda x: print("Observer A : {0}".format(x))
)
behavior_subject.on_next("Hello")
behavior_subject.subscribe(
   lambda x: print("Observer B : {0}".format(x))
)
behavior_subject.on_next("Last call to Behaviour Subject")

산출

E:\pyrx>python testrx.py
Observer A : Testing Behaviour Subject
Observer A : Hello
Observer B : Hello
Observer A : Last call to Behaviour Subject
Observer B : Last call to Behaviour Subject

재생 주제

replaysubject는 행동 주체와 유사하며, 값을 버퍼링하고 새 구독자에게 동일하게 재생할 수 있습니다. 다음은 리플레이 주제의 작동 예입니다.

from rx.subject import ReplaySubject
replay_subject = ReplaySubject(2)
replay_subject.subscribe(lambda x: print("Testing Replay Subject A: {0}".format(x)))
replay_subject.on_next(1)
replay_subject.on_next(2)
replay_subject.on_next(3)
replay_subject.subscribe(lambda x: print("Testing Replay Subject B: {0}".format(x)));
replay_subject.on_next(5)

사용 된 버퍼 값은 재생 주제에서 2입니다. 따라서 마지막 두 값은 버퍼링되어 호출 된 새 구독자에 사용됩니다.

산출

E:\pyrx>python testrx.py
Testing Replay Subject A: 1
Testing Replay Subject A: 2
Testing Replay Subject A: 3
Testing Replay Subject B: 2
Testing Replay Subject B: 3
Testing Replay Subject A: 5
Testing Replay Subject B: 5

AsyncSubject

AsyncSubject의 경우 마지막으로 호출 된 값이 구독자에게 전달되고 complete () 메서드가 호출 된 후에 만 ​​수행됩니다.

from rx.subject import AsyncSubject
async_subject = AsyncSubject()
async_subject.subscribe(lambda x: print("Testing Async Subject A: {0}".format(x)))
async_subject.on_next(1)
async_subject.on_next(2)
async_subject.on_completed()
async_subject.subscribe(lambda x: print("Testing Async Subject B: {0}".format(x)))
Here, before complete is called, the last value passed to the subject is 2, and the same is given to the subscribers.

산출

E:\pyrx>python testrx.py
Testing Async Subject A: 2
Testing Async Subject B: 2