Что такое горячая и холодная наблюдаемые?
Я смотрел видео и знаю общие принципы - горячее случается, даже когда никто не подписан, холодное происходит "по требованию". Кроме того, Publish() преобразует холодный в горячий, а Defer() - в холодный.
Но все же я чувствую, что мне не хватает деталей. Вот несколько вопросов, на которые я бы хотел ответить:
- Можете ли вы дать исчерпывающее определение для этих терминов?
- Имеет ли смысл когда-либо называть "Публикация в горячем виде" или "Отложить в холод"?
- Каковы аспекты горячих / холодных конверсий - вы теряете сообщения, например?
- Есть ли различия между горячими и холодными определениями для IObservable и IEnumerable?
- Какие общие принципы вы должны учитывать при программировании для холодного или горячего?
- Любые другие советы по горячим / холодным наблюдаемым?
4 ответа
Надеюсь, это поможет.
Можете ли вы дать исчерпывающее определение для этих терминов?
Смотрите мое сообщение в блоге по адресу: 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 минут, то время, потраченное на их кодирование, будет для вас гораздо продуктивнее, чем чтение:)
Из: Книга Антона Моисеева "Угловая разработка с машинописным текстом, второе издание".:
Горячие и холодные наблюдаемые
Есть два типа наблюдаемых: горячие и холодные. Основное отличие состоит в том, что холодный наблюдаемый объект создает производителя данных для каждого подписчика, тогда как горячий наблюдаемый сначала создает производителя данных, а каждый подписчик получает данные от одного производителя, начиная с момента подписки.
Давайте сравним просмотр фильма на Netflix с походом в кинотеатр. Думайте о себе как о наблюдателе. Любой, кто решит посмотреть "Миссия невыполнима" на Netflix, получит весь фильм, независимо от того, когда он нажмет кнопку воспроизведения. Netflix создает нового продюсера, который будет транслировать фильмы специально для вас. Это холодное наблюдение.
Если вы идете в кинотеатр, а время показа - 16:00, продюсер создается в 16:00, и начинается трансляция. Если некоторые люди (подписчики) опаздывают на шоу, они пропускают начало фильма и могут смотреть его только с момента прибытия. Это горячая наблюдаемая.
А холодные наблюдаемые начинает производить данные, когда какой - то код вызывает подписки () функцию на ней. Например, ваше приложение может объявлять наблюдаемый объект, предоставляющий URL-адрес на сервере для получения определенных продуктов. Запрос будет сделан только тогда, когда вы на него подпишетесь. Если другой скрипт сделает такой же запрос к серверу, он получит тот же набор данных.
Горячий наблюдаемым производит данные, даже если нет абонентов не заинтересованы в данных. Например, акселерометр в вашем смартфоне выдает данные о положении вашего устройства, даже если ни одно приложение не подписывается на эти данные. Сервер может предоставить последние цены на акции, даже если ни один пользователь не заинтересован в этих акциях.
Горячие наблюдаемые - это те, которые выдвигаются, даже когда вы не подписаны на наблюдаемые. Как движения мыши, тики Таймера или что-то в этом роде. Холодные наблюдаемые - это те, которые начинают выдвигаться только тогда, когда вы подписываетесь, и начинаются заново, если вы подписываетесь снова.
Не делая вид, что даю исчерпывающий ответ, я хотел бы кратко изложить то, что я узнал со времени этого вопроса.
Горячая наблюдаемая - точное совпадение с событием. В событиях значения обычно вводятся в обработчик, даже если подписчики не слушают. Все подписчики получают одинаковый набор значений. Из-за следования модели "события" горячие наблюдаемые легче понять, чем холодные.
Cold observable также похож на событие, но с изюминкой - событие Cold observable не является свойством общего экземпляра, это свойство объекта, которое создается на фабрике каждый раз, когда кто-то подписывается. Кроме того, подписка запускает производство значений. Из-за вышеизложенного несколько подписчиков изолированы, и каждый получает свой собственный набор значений.
Самая распространенная ошибка, которую допускают новички в RX, - это создание холодной наблюдаемой (ну, думая, что они создают холодную наблюдаемую), используя некоторые переменные состояния внутри функции (например, общее количество), а не упаковывая ее в оператор.Defer(). В результате несколько подписчиков разделяют эти переменные и вызывают побочные эффекты между ними.
наблюдаемый
Концептуально, наблюдаемый - это просто оболочка для некоторых данных или источника событий, предоставляющая некоторый удобный интерфейс для обработки источника как потока данных, который обновляет свои значения в режиме реального времени.
Холодная наблюдаемая
В так называемой "холодной" версии источник не активен и его можно сравнить с планом, классами или прототипами. Следовательно, наблюдаемое ничего не производит. Как ожидающий или приостановленный поток. Это делает чистое значение, которое вы можете безопасно передать чистой функции. Хорошим примером является приостановленный счетчик, который всегда начинается с 1 при активации.
"Подписка" на "холодную наблюдаемость" действительно означает две вещи: создание (или разветвление) активного экземпляра потока данных и присоединение подписчика. Первая часть похожа на создание объектов из класса. Вторая часть является действительной подпиской и сама по себе не имеет ничего общего с первой частью. Несмотря на то, что он "упакован" как единая "подписка", что, на мой взгляд, только добавляет путаницы.
Горячая наблюдаемая
Так называемая "горячая наблюдаемая" - это уже запущенный экземпляр. Как объект, созданный из прототипа и готовый к использованию. И подписка, очевидно, включает в себя только фактическое присоединение наблюдателя. Активация не требуется.