什么是热和冷可观测量?

时间:2010-03-26 05:20:27

标签: system.reactive

I watched the video我知道一般原则 - 即使没有人订阅也会发生热情,冷却发生在“按需”。 此外,Publish()将cold转换为hot,而Defer()将hot转换为cold。

但是,我觉得我错过了细节。以下是我想回答的一些问题:

  • 您能为这些条款提供全面的定义吗?
  • 在热门的观察中呼叫发布还是坚持感冒是否有意义?
  • 热/冷转换的哪些方面 - 例如,您是否丢失了消息?
  • IObservable和IEnumerable的热定义和冷定义之间是否存在差异?
  • 在为冷或热编程时应该考虑哪些一般原则?
  • 关于热/冷可观测量的任何其他提示?

5 个答案:

答案 0 :(得分:27)

我希望这会有所帮助。

  

你能全面提供吗?      这些术语的定义是什么?

请参阅我的博文:http://leecampbell.blogspot.com/2010/08/rx-part-7-hot-and-cold-observables.html

  

打电话有意义吗?      在热的可观察或延迟上发布      感冒了吗?

不,不是我能想到的。

  

热/冷的哪些方面      转换 - 你丢失了消息,      例如?

当Observable为Hot时,可能会“丢失”消息,因为“事件”无论订阅者如何都会发生。

  

hot和。之间是否存在差异?      IObservable和。的冷定义      IEnumerable的?

我真的不明白这个问题。我希望这个比喻有所帮助。我会将Hot Observable与热切评估的IEnumerable进行比较。即一个列表或一个数组都被热切评估,并且已经填充,即使没有人对它们进行说明。可以使用Yield关键字延迟评估从文件或数据库获取值的yield语句。虽然懒惰可能很好,但默认情况下,如果第二个枚举器在其上运行,则会重新评估。将这些与Observables进行比较,Hot Observable可能是一个事件(按钮点击)或温度馈送;无论订阅如何,这些事件都会发生,如果对同一个observale进行了多次订阅,也会共享这些事件。 Observable.Interval是Cold Observable的一个很好的例子。它只会在订阅时开始生成值。如果进行了多次订阅,那么将重新评估序列,并且“事件”将在单独的时间发生(取决于订阅之间的时间)。

  

在为冷或热编程时应该考虑哪些一般原则?

请参阅第一点中的链接。我还建议您查看与RefCount一起使用的Publsh。这使您能够具有Cold Observables的Lazy评估语义,但可以共享Hot Observables获得的事件。

  

关于热/冷的任何其他提示      可观测量?

弄脏你的手并与他们玩耍。一旦你读了它们超过30分钟,那么用它们编写代码的时间对你来说要比阅读它们更有成效:)

答案 1 :(得分:18)

即使您没有订阅观察者,热门观察者也会推动。像鼠标移动,或计时器滴答或类似的东西。寒冷的观察者只有在你订阅时才开始推动,如果你再次订阅就会重新开始。

答案 2 :(得分:9)

不是假装给出一个全面的答案,我想以最简单的形式总结自我提出这个问题以来所学到的知识。

热观察与事件完全匹配。在事件中,即使没有订阅者正在侦听,值通常也会被送入处理程序。所有订阅者都收到相同的值集。由于遵循“事件”模式,热点可观察量比冷点更容易理解。

冷可观察也像一个事件,但有一个转折 - Cold observable的事件不是共享实例上的属性,它是从工厂生成的对象上的属性有人订阅的时候。此外,订阅开始生成值。由于上述原因,多个订户被隔离,每个订户都收到自己的一组值。

RX初学者最常犯的错误是使用函数中的一些状态变量(f.e.累计总数)创建一个冷可观察对象(好吧,认为他们正在创建一个冷可观察对象),而不是将它包装到.Defer()语句中。因此,多个订阅者共享这些变量并导致它们之间产生副作用。

答案 3 :(得分:1)

来自:Anton Moiseev书“带打字稿的角度开发,第二版。”:

冷热观测

两种类型的可观察对象:冷热。主要区别在于可观察的 每个订户创建了数据生成器,而热可观察者先创建一个数据生产者,然后每个订阅者一个生产者获取数据,< 订阅的那一刻开始

让我们比较一下在 Netflix 上观看电影和进入电影院的情况。想想自己是一个观察者。任何决定在Netflix上观看《碟中谍》的人,无论何时按下播放按钮,都将获得整部电影。 Netflix创建了一个新的制片人,专门为您播放电影。这是可观察的

如果您去电影院并且放映时间是下午4点,则制片人是在下午4点创建的,流媒体开始播放。如果某些人(订户)迟到了演出,他们会错过电影的开头,只能从到达的那一刻开始观看。这是可观察到的

当某些代码在其上调用 subscribe()函数时,冷可观察开始产生数据。例如,您的应用可能声明了可观察到的在服务器上提供URL以获得某些产品的URL。仅当您订阅时才发出请求。如果另一个脚本向服务器发出相同的请求,它将获得相同的数据集。

可热观察会产生数据,即使没有订阅者对数据感兴趣。例如,即使没有应用程序订阅此数据,智能手机中的加速度计也会产生有关设备位置的数据。即使没有用户对此服务器感兴趣,服务器也可以产生最新的股票价格。

答案 4 :(得分:-2)

可观察

从概念上讲,observable只是一些数据或事件源的包装器,提供了一些方便的接口,可以将源视为实时更新其值的数据流。

冷可观察

在&#34;感冒&#34;版本,源不活动,可以与蓝图,类或原型进行比较。因此,观察者不会产生任何东西。像待处理或暂停的流。这使它成为一个纯值,您可以安全地传递给纯函数。一个很好的例子是一个暂停的计数器,它在激活时始终以1开始。

&#34;订阅&#34;冷静观察&#34;冷静观察&#34;意味着两件事:创建(或分叉)活动数据流实例并附加订阅者。第一部分类似于从类创建对象。第二部分是实际订阅,本身与第一部分无关。

Hot Observable

&#34; hot observable&#34;已经是一个正在运行的实例。就像从原型创建并准备使用的对象一样。订阅仅涉及附加的实际观察者。不需要激活部件。