Question

I watched the video and I know the general principles - hot happens even when nobody is subscribed, cold happens "on demand". Also, Publish() converts cold to hot and Defer() converts hot to cold.

But still, I feel I am missing the details. Here are some questions I'd like to have answered:

  • Can you give a comprehensive definition for these terms?
  • Does it ever make sense to call Publish on a hot observable or Defer on a cold?
  • What are the aspects of Hot/Cold conversions - do you lose messages, for example?
  • Are there differences between hot and cold definitions for IObservable and IEnumerable?
  • What are the general principles you should take into account when programming for cold or hot?
  • Any other tips on hot/cold observables?
Was it helpful?

Solution

I hope this helps.

Can you give a comprehensive definition for these terms?

See my blog post at: http://leecampbell.blogspot.com/2010/08/rx-part-7-hot-and-cold-observables.html

Does it ever make sense to call Publish on a hot observable or Defer on a cold?

No, not that I can think of.

What are the aspects of Hot/Cold conversions - do you lose messages, for example?

It is possible to "lose" messages when the Observable is Hot, as "events" happen regardless of subscribers.

Are there differences between hot and cold definitions for IObservable and IEnumerable?

I dont really understand the question. I hope this analogy helps though. I would compare a Hot Observable to an Eagerly evaluated IEnumerable. ie a List or an Array are both Eagerly evaluated and have been populated even if no-one enuemerates over them. A yield statement that gets values from a file or a database could be lazily evaluated with the Yield keyword. While lazy can be good, it will by default, be reevaluated if a second enumerator runs over it. Comparing these to Observables, a Hot Observable might be an Event (Button click) or a feed of temperatures; these events will happen regardless of a subscription and would also be shared if multiple subscriptions were made to the same observale. Observable.Interval is a good example of a Cold observable. It will only start producing values when a subscription is made. If multiple subscriptions as made then the sequence will be re-evaluated and the "events" will occur at seperate times (depending on the time between subscriptions).

What are the general principles you should take into account when programming for cold or hot?

Refer to the link in point one. I would also recommend you look into Publsh being used in conjunction with RefCount. This allows you to have the ability to have Lazy evaluation semantics of Cold Observables but the sharing of events that Hot Observables get.

Any other tips on hot/cold observables?

Get your hands dirty and have a play with them. Once you have read about them for more than 30minutes, then time spent coding with them is far more productive to you than reading any more :)

OTHER TIPS

Hot observables are ones that are pushing even when you are not subscribed to the observable. Like mouse moves, or Timer ticks or anything like that. Cold observables are ones that start pushing only when you subscribe, and they start over if you subscribe again.

Not pretending to give a comprehensive answer, I'd like to summarize in a simplest form what I have learned since the time of this question.

Hot observable is an exact match for event. In events, values usually are fed into the handler even if no subscribers are listening. All subscribers are receiving the same set of values. Because of following the "event" pattern, hot observables are easier to understand than the cold ones.

Cold observable is also like an an event, but with a twist - Cold observable's event is not a property on a shared instance, it is a property on an object that is produced from a factory each time when somebody subscribes. In addition, subscription starts the production of the values. Because of the above, multiple subscribers are isolated and each receives its own set of values.

The most common mistake RX beginners make is creating a cold observable (well, thinking they are creating a cold observable) using some state variables within a function (f.e. accumulated total) and not wrapping it into a .Defer() statement. As a result, multiple subscribers share these variables and cause side effects between them.

Observable

Conceptually, observable is simply a wrapper around some data or event source, providing some convenient interface to treat the source as data stream that updates its values in real time.

Cold Observable

In the "cold" version, the source is not active and can be compared to blueprint, classes or prototypes. Hence the observable does not produce anything. Like a pending or suspended stream. That makes it a pure value that you can safely pass to a pure function. A good example is a suspended counter that always starts with 1 when activated.

"Subscribing" to a "cold observable" means two things: Creating (or forking) an active data stream instance and attaching the subscriber. The first part is similar to creating objects from a class. The second part is the actual subscription and by itself, has nothing to do with the first part.

Hot Observable

The "hot observable" is already an instance that is running. Like an object created from the prototype and ready for use. And subscribing is involving only the actual observer attaching. No activation part is needed.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top