Что такое горячая и холодная наблюдаемые? - PullRequest
40 голосов
/ 26 марта 2010

Я смотрел видео и знаю общие принципы - горячее случается, даже когда никто не подписан, холодное происходит "по требованию". Кроме того, Publish () преобразует холодный в горячий, а Defer () преобразует горячий в холодный.

Но все же я чувствую, что мне не хватает деталей. Вот несколько вопросов, на которые я бы хотел ответить:

  • Можете ли вы дать исчерпывающее определение этим терминам?
  • Имеет ли смысл когда-либо называть «Публикация в горячем виде» или «Отложить в холод»?
  • Каковы аспекты горячих / холодных преобразований - например, вы теряете сообщения?
  • Есть ли различия между горячим и холодным определениями для IObservable и IEnumerable?
  • Какие общие принципы следует учитывать при программировании для холодного или горячего?
  • Есть еще какие-нибудь советы по горячим / холодным наблюдаемым?

Ответы [ 4 ]

27 голосов
/ 19 августа 2010

Надеюсь, это поможет.

Можете ли вы дать всеобъемлющий определение этих терминов?

См. Мой блог в: http://leecampbell.blogspot.com/2010/08/rx-part-7-hot-and-cold-observables.html

Имеет ли смысл звонить Опубликовать на горячую заметку или отложить на холод?

Нет, не то, чтобы я мог думать.

Каковы аспекты горячей / холодной конверсии - вы теряете сообщения, например?

Возможно «потерять» сообщения, когда «Наблюдаемый» горячий, поскольку «события» происходят независимо от подписчиков.

Есть ли различия между горячим и холодные определения для IObservable и IEnumerable?

Я не совсем понимаю вопрос. Я надеюсь, что эта аналогия помогает, хотя. Я бы сравнил Hot Observable с нетерпеливо оцененным IEnumerable. т. е. List или Array оба оценены с нетерпением и заполнены, даже если никто не перечисляет их. Оператор yield, который получает значения из файла или базы данных, может лениво оцениваться с помощью ключевого слова Yield. Хотя lazy может быть хорошим, по умолчанию он будет переоценен, если над ним будет работать второй перечислитель. Сравнивая их с Observables, Hot Observable может быть событием (нажатие кнопки) или подачей температуры; эти события будут происходить независимо от подписки, а также будут передаваться, если несколько подписок были сделаны на одну и ту же обсервалию Observable.Interval - хороший пример холодной наблюдаемой. Это только начнет производить значения, когда подписка сделана. Если выполнено несколько подписок, последовательность будет переоценена, и «события» будут происходить в разное время (в зависимости от времени между подписками).

Какие общие принципы следует учитывать при программировании для холодного или горячего?

См. Ссылку в первом пункте. Я также рекомендовал бы вам изучить использование Publsh в сочетании с RefCount. Это позволяет вам иметь ленивую семантику оценки Cold Observables, но обмениваться событиями, которые получают Hot Observables.

Любые другие советы по горячей / холодной Наблюдаемые?

Запачкайте руки и поиграйте с ними. После того, как вы прочитали о них более 30 минут, время, потраченное на их кодирование, станет для вас гораздо более продуктивным, чем чтение:)

19 голосов
/ 31 марта 2010

Горячие наблюдаемые - это те, которые выдвигаются, даже если вы не подписаны на наблюдаемые.Как движения мыши, или таймеры или что-то в этом роде.Холодные наблюдаемые - это те, которые начинают выдвигаться только тогда, когда вы подписываетесь, и начинаются заново, если вы подписываетесь снова.

9 голосов
/ 06 июня 2011

Не претендуя на исчерпывающий ответ, я хотел бы кратко изложить то, что я узнал со времени этого вопроса.

Горячая наблюдаемая - точное совпадение для события. В событиях значения обычно вводятся в обработчик, даже если подписчики не слушают. Все подписчики получают одинаковый набор значений. Из-за следования модели «события» горячие наблюдаемые легче понять , чем холодные.

Cold Observable также похоже на событие, но с изюминкой - событие Cold Observable не является свойством общего экземпляра, это свойство объекта, который каждый раз создается на фабрике. когда кто-то подписывается. Кроме того, подписка запускает производство значений. Из-за вышеизложенного несколько подписчиков изолированы, и каждый получает свой собственный набор значений.

Самая распространенная ошибка, которую допускают новички в RX, - это создание наблюдаемой в холодном состоянии (ну, думая, что они создают наблюдаемую в холодном состоянии), используя некоторые переменные состояния внутри функции (например, общее количество) и не заключая ее в оператор .Defer (). В результате несколько подписчиков разделяют эти переменные и вызывают побочные эффекты между ними.

0 голосов
/ 20 мая 2017

Наблюдаемые

Концептуально, наблюдаемый - это просто оболочка для некоторых данных или источника событий, обеспечивающая некоторый удобный интерфейс для обработки источника как потока данных, который обновляет свои значения в режиме реального времени.

Холодная наблюдаемая

В «холодной» версии источник не активен и его можно сравнить с планом, классами или прототипами. Следовательно, наблюдаемое ничего не производит. Как ожидающий или приостановленный поток. Это делает чистое значение, которое вы можете безопасно передать чистой функции. Хорошим примером является приостановленный счетчик, который всегда начинается с 1 при активации.

«Подписка» на «холодное наблюдение» означает две вещи: создание (или разветвление) экземпляра активного потока данных и присоединение подписчика. Первая часть похожа на создание объектов из класса. Вторая часть является действительной подпиской и сама по себе не имеет ничего общего с первой частью.

Горячая наблюдаемая

«Горячая наблюдаемая» - это уже запущенный экземпляр. Как объект, созданный из прототипа и готовый к использованию. И подписка включает в себя только фактическое присоединение наблюдателя. Активация не требуется.

...