c# - unirx - why reactivex




IEnumerable<T> 및 IObservable<T>와 같은 푸시 기반 구조와 끌어 오기 기반 구조의 차이점은 무엇입니까? (3)

IEnumerableIObservable 에 대해 읽은 모든 기술 자료 나 모든 블로그 게시물에서 IEnumerable 은 pull 기반 구조이고 IObservable 은 push 기반 구조입니다.

IObservable 을 사용하여 비동기 호출을 읽었습니다. 아무것도 차단되지 않고 모든 것이 푸시 기반입니다.

하지만,하지만 ...

그것은 실제로 무엇을 의미합니까? 푸시 기반 및 기반

내 의견으로는 IEnumerable 에서 데이터를 구조로 푸시 할 수도 있고 데이터를 가져올 수도 있기 때문에 기술적 인 용어와 아이디어를 잃어 버렸습니다.

평범하고 인간적인 방법으로 푸시 기반 구조와 끌어 오기 기반 구조의 두 가지 구조와 차이점을 설명해주십시오.

감사.


평범하고 인간적인 방법으로 나에게 차이점을 설명해주세요.

좋아, 토스트 좀 만들어 보자. 그게 내가하는 가장 일반적인 인간의 일이야.

당기는 기초 :

// I want some toast.  I will pull it out of the toaster when it is done.
// I will do nothing until the toast is available.
Toast t = toaster.MakeToast();
t.AddJam();
// Yum.

푸시 기반 :

// I want some toast.  But it might take a while and I can do more work
// while I am waiting:
Task<Toast> task = toaster.MakeToastAsync();
Toast t = await task;
// await returns to the caller if the toast is not ready, and assigns
// a callback. When the toast is ready, the callback causes this method
// to start again from this point:
t.AddJam();
// Yum.

결과를 가져 오려면 함수를 호출하고 함수가 반환 될 때까지는 아무 것도하지 않습니다.

결과가 푸시되고 싶으면 비동기 함수를 호출하고 결과를 기다립니다. 결과를 사용할 수있게되면 콜백에 푸시되며, 필요한 곳에 메소드가 다시 시작됩니다.

IEnumerable<T> 는 끌어 오기의 순서입니다. 결과를 가져올 때마다 MoveNext 를 호출하고 T 를 얻습니다. IObservable<T> 는 푸시 순서입니다. 콜백을 등록하면 새 T 를 사용할 수있을 때마다 호출됩니다.

다른 말로하면 : IEnumerable<T> 는 논리적으로 Func<T> 호출 시퀀스입니다. IObservable<T> 는 논리적으로 Task<T> 연속 시퀀스입니다. 시퀀스가 당신을 혼란스럽게한다는 사실을 알려주지 마십시오. 부수적 인 일입니다. 근본적인 아이디어는 기능이 동기 적이라는 것입니다. 당신은 그것들을 호출하고 동 기적 으로 결과를 얻습니다; 시간이 좀 걸리면 기다려. 작업은 비동기식입니다. 사용할 수있을 때 비동기 적으로 결과를 시작합니다.

이 아이디어는 IObservable 전에 await C #에 존재했습니다. 살펴볼 또 다른 방법은 pull-based는 함수 호출과 같고 푸시 기반은 이벤트 핸들러와 같습니다. 정상적인 함수 호출이라면, 뭔가를 원할 때 호출합니다. 이벤트 핸들러는 무언가가 발생하면 당신을 호출합니다. 이벤트는 C # 언어 자체가 관찰자 패턴을 나타내는 방식 입니다. 그러나 이벤트는 항상 논리적으로 시퀀스 를 구성하기 때문에 푸시 된 아이템의 시퀀스를 조작하는 것과 같은 방식으로 푸시 된 아이템의 시퀀스를 조작 할 수 있다는 것은 의미가 있습니다. 그래서 IObservable 이 발명되었습니다.


한 남자가 식료품 점에 들어가서 가게 주인에게 달걀이 있는지 물어 봅니다. "예,"가게 주인은 말한다. "나 좀 먹을 래?" 그 남자에게 묻는다. 그리고 가게 주인은 남자에게 알을 줬다. "너는 더 이상 있니?" 그 남자에게 묻는다. "예,"가게 주인은 말한다. "나 좀 먹을 래?" 그 남자에게 묻는다. 그리고 가게 주인은 남자에게 알을 줬다. "너는 더 이상 있니?" 그 남자에게 묻는다. "아니요."가게 주인은 말한다. 남자가 떠난다.

그건 당겨 기반이야. 그 남자는 상점 주인에게 달걀이 남아 있지 않을 때까지 달걀을 "당기다".

한 남자가 식료품 점에 들어가서 가게 주인에게 달걀을 배달 할 수 있는지 묻고, 그렇다면 달걀을 가져올 때마다 배달 할 수 있습니다. "예,"가게 주인은 말한다. 남자가 떠난다. 며칠 내에 계란이 도착합니다. 며칠 후 일부 달걀이 도착합니다. 그런 다음 그 남자는 가게 주인에게 전화를해서 배달 중단을 요구합니다. 계란이 더 이상 도착하지 않습니다.

푸시 기반입니다. 그 남자는 가게 주인이 알을 낳을 때까지 기다리지 않습니다. 그 남자는 다른 일을하는 것에 대해 간다. 가게 주인은 알을 남자에게 "밀어 넣는다".


위의 위대한 답변 외에도 다음을 제공합니다.

  • '열거 형'을 의미하는 'IEnumerable'은 .NET 프레임 워크 개념 모델에서 '끌어 오기 기반'과 함축적으로 혼동됩니다. "다음 값을 가져올 수있는 열거자를 얻을 수 있음"을 의미합니다.
  • 그러나 IAsyncEnumerable도 있습니다.
  • 수학적으로 열거 할 수있는 것은 단지 '셀 수있는'즉 셀 수있는 집합을 의미합니다.
  • Observables는 관찰 가능이 일련의 이산 사건을 나타낼 수 있다는 점에서 너무 중요합니다.

이름은 혼란스럽고 제 의견으로는 그들이 의도 한 개념을 잘 나타내지 못합니다. 예를 들어, Java 세계에서 IEnumerable은 Iterable이며, 이는 .NET의 의도에 더 가깝습니다.

Observables는 응답 할 수있는 들어오는 스트림으로 생각할 수있는 반면 IEnumerable과 LINQ는 "소스에서 일부 데이터를 가져 와서 필터링 / 그룹화하십시오." 라고 생각하는 것이 가장 간단하다고 생각합니다. 나는 관측 가능성을 계속성으로 생각하는 것이 반드시 도움이된다고 생각하지 않는다.





ienumerable