1

어떤 시점에서 프로젝트에서 Rx를 사용할 계획이며 Rx로 할 수있는 것에 대해 연구하고 있습니다.반응 확장 및 병렬 처리

내 프로젝트는 상태 머신 전환을 처리하기 위해 TPL을 사용합니다 (사용 가능한 모든 프로세서 코어 활용). 그러나 성능을 향상시키기 위해 현재 IList <> 끌어 오기 메커니즘을 Rx 푸시 메커니즘으로 대체하려고합니다.

이 기술에 대해 잘 모르기 때문에 Rx가 토큰을 병렬 상태 전환으로 푸시하는 것과 호환되는지 여부를 확인하고자합니다. 모든 병렬 상태 전이가 Rx 주체에 구독하고 다음 토큰을 검색하도록 요구할 것입니다. 각 상태 전환에는 주제와 동일한 토큰이 필요합니다. 내 자신의 연구에서 이해할 수있는 것은 일단 토큰이 옵저버 (이 경우에는 상태 전이)로 밀려 나면 토큰이 잘 사라 졌다는 것입니다. 이 경우 (동일한 상태에 대한) 다른 전환은이 토큰을 절대로받지 못하고 오류 상태가됩니다.

내 관심사가 올바른지 누군가가 나를 깨달을 수 있습니까? 내가 옵션을 탐색하는 중일 뿐이므로 코드를 표시 할 필요가 없습니다.

감사합니다.

답변

0

당신은 아마

IConnectableObservable<T> IObservable<T>.Publish() 

접속 가능 관찰을 찾고 있습니다 원래 관찰의 멀티 캐스트 변형이며, 여러 번에 등록 할 수 있습니다. 모든 관찰자를 connectableobservable에 등록한 다음 connectableObservable에서 connect를 호출하면됩니다.

1

등록 된 이벤트 핸들러의 스레드 세이프리스트 인 .NET 이벤트와 유사하게 Rx Subject를 생각하는 것이 도움이 될 수 있습니다. 주체의 경우 이들은 개별적인 옵서버 OnNext 대표와 동등한 것으로 간주 될 수있다. 이벤트가 시작되면 각 핸들러는 동일한 이벤트 인수로 호출됩니다. 마찬가지로 Subject에 가입 된 각 Observer는 동일한 인수 객체를 사용하여 OnNext를 호출합니다. 이 인수는 상태 전이에 필요한 토큰의 값 유형 또는 참조 유형을 포함 할 수 있습니다. 아마도 옵서버의 OnNext 처리기는 해당 토큰을 병행 대기열에 저장하여 해당 병렬 작업 소비를 저장합니다.

OnNext 호출을 무시하거나 전달 된 객체를 무시하지 않는 한 아무 것도 사라지지 않습니다.

작업 중 하나가 토큰을 변경하면 공유 상태 손상 문제가 발생할 수 있습니다. 또는 하나의 작업이 여러 개의 상태 전이 토큰을 처리하고 다른 작업이 첫 번째 작업도 대기열에서 제외 할 시간이없는 경우 동기화 문제가 발생할 수 있습니다. 그러나 이것은 토큰을 푸시하는 다른 기술 대신 Rx Subject를 사용하는 것과 관련이 없습니다.

-1

@Tony는 Observable Sequence (IObservable)가 등록자/이벤트 처리기의 스레드로부터 안전한 목록을 가질 수 있다는 점에서 좋은 점입니다. 이벤트와 마찬가지로 많은 등록 된 가입자는 이벤트 페이로드를 수신 할 수 있습니다 (처음 가입자가 먼저 호출되는 직렬 방식).

그러나 해결되지 않은 점은 Rx가 당신을 도울 수있는 시간에 대한 잠재적 인 우려입니다. 예를 들어, 모든 병렬 상태 전이 핸들러가 설정되기 전에 토큰을 게시/푸시했을 수 있습니다. 이벤트 또는 표준 관찰 가능 시퀀스를 사용하는 경우 페이로드가 손실됩니다. Replay와 같은 Rx의 캐싱 기능을 사용하여이를 해결할 수 있습니다. 이렇게하면 후기 구독자에게 마지막 값을 재생할 수 있습니다.

관심이있는 경우 많은 정보가 있습니다. 내 책 섹션에서 자세한 내용을 볼 수 있습니다. http://introtorx.com/Content/v1.0.10621.0/02_KeyTypes.html