Обзор. Для обсуждения параллелизма в JavaScript необходим новый словарь, построенный на основе операторов RxJS.

Асинхронный. Жесткий. Является.

В библиотеках вроде ReactiveX / RxJS есть инструменты, которые могут понадобиться для управления всеми видами параллелизма, но они слишком сложны, требуют слишком крутого обучения и содержат множество различных способов выражения простых вещей. В результате часто используемые шаблоны трудно найти, и, как только они будут найдены, их решения будут унесены неразборчивым роем операторов. Не поймите меня неправильно, я фанат, но это правда :)…

Что нужно, так это легко выучить и легко запомнить лексику для разговоров о параллелизме.

НаблюдаемыйПроцесс

«Называть сложно» - раньше я слышал протесты людей. Конечно, я понял. Но меня расстраивает одна вещь: Observable - самый полезный тип данных, достигший совершеннолетия со времен Array, но его имя настолько самоубийственно, что похоже на Эдварда Нортона из Бойцовского клуба!

Мне пришлось бы очень постараться, чтобы выбрать худшее имя для типа данных, а поскольку Object уже занят, Observable должен быть №2 наихудшим. Что ваше «наблюдаемое» говорит мне о вас - что я могу сидеть и смотреть на вас? Смотри, что ты делаешь? Я человек занятой, мне уже есть на что посидеть и посмотреть.

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

Итак, давайте начнем с нуля с более общей формулировки:

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

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

Что касается остального, нам не нужен технический словарь, чтобы описать процесс! Бургер идет на гриль. Готовится какое-то время. Это либо делается, либо разрушается. И шеф-повар может кричать не только тогда, когда это будет готово, но и в разное время, когда это будет в разных оздоровительных центрах. Понятно? Хорошо, потому что я проголодался.

Сейчас 2018 год, почему не все используют Observables (или RxJS, или Angular)?

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

Q: Что это? (Ответ в подписи)

Хахаха. А теперь позвольте мне показать вам, что происходит, когда язык используется для другой, темной цели:

Переключатель. Преобразуйте Observable, который испускает Observables, в один Observable, который испускает элементы, испускаемые последними из этих Observable.

Эта истинная цитата, взятая отсюда, по общему признанию, является документацией для инженеров. Но это для общего сценария, возможно, самого полезного из 4 распространенных способов приготовления гамбургеров, также известного как параллелизм. Но это не объясняется в контексте с другими способами или какой-либо метафорой. И уж точно не весело! Вот где этот пост входит в микс ..

Нужно знать всего четыре вещи

Существует 4 основных режима параллелизма (формальное название «приготовление гамбургеров»), которыми, возможно, придется управлять шеф-повару или программисту. Независимо от вашей работы, это применимо, если к вам применяются определенные критерии:

  1. Для выполнения своей работы при возникновении определенных событий вы запускаете процесс обработки этого события.
  2. Для выполнения этих процессов потребуется время и ресурсы.
  3. Эти процессы в среднем могут длиться дольше, чем запускающие их события, представляющие решения по управлению ресурсами.

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

Параллельно

Первый и стандартный режим параллелизма - это режим, который я называю parallel. Шеф-повар просто продолжает выкладывать заказы на гриль, когда они становятся доступными или готовыми. У него должен быть большой гриль, если он может работать таким образом, независимо от того, насколько велика толпа за обедом, но без каких-либо ограничений это удовлетворит людей больше всего, если не заставит его немного устать!

Последовательный

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

Отсечка

Режим отсечения вступает в игру, когда заказ необходимо изменить или отменить. Подождите, у меня аллергия на лук означает, что вам нужно прекратить и отменить первый гамбургер с луком, не тратить на него больше времени, а сразу начать новый!

Отключить

Режим без звука, хотя он может вывести ресторан из строя, уместен в некоторых случаях, не связанных с рестораном (кхм, воспитание детей). В этом случае шеф-повар сварливо готовит на своем единственном гриле, и если какой-то заказ приходит, пока Шеф уже готовит - он сразу уходит в мусор! Позже он подаст бургер и спросит: Есть заказы? О, шеф! Это не очень вежливо. Но обратите внимание - без звука может быть то, что происходит у двери, если очередь в ресторане настолько длинная, что они просто начнут отворачивать посетителей.

На этом мы завершаем наше введение в параллелизм! Не так уж и плохо было? Прошло много времени с тех пор, как я был очарован и узнал о RxJS. Мне потребовалось много времени, чтобы некоторые из языков обрели смысл, и отчасти в этом виноват язык. Но технология поистине революционная. Тот факт, что один тип данных может быть описан множеством способов, полезен во многих сценариях, но при этом настолько сложен для объяснения, является той проблемой, которую объясняющий, как я, любит пытаться решать.

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

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

RxJS поистине великолепен, и они много сделали для того, чтобы лучше понять, что нужно для реального управления параллелизмом. Мне особенно нравится использование таких визуальных моделей, как эта, в которой они объясняют режим cutoff, который они называют либо switch, либо switchMap:

Получайте удовольствие, копаясь в мире RxJS, как и я, и, пожалуйста, поделитесь этим с любым шеф-поваром, которому это может понравиться!

Декан

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