Узнайте, что такое очередь параллельных задач, как лучше всего ее использовать и как ее создать.

Очередь - одна из наиболее часто используемых структур данных.

Вы, вероятно, используете его каждый день, когда покупаете продукты (даже в Интернете) или когда отправляете текстовое сообщение своим друзьям.

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

Начнем с основ

Что такое очередь? 🚶🚶🚶‍

Очередь - это линейная структура, в которой значения добавляются с одного конца и удаляются с другого. Эта дисциплина приводит к поведению в порядке очереди (FIFO), которое является определяющей особенностью очередей. Две основные операции с очередью - это добавление в очередь (добавление в конец) и удаление из очереди (удаление спереди) (источник).

Хорошо, когда мы должны его использовать?

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

Отлично, вы меня убедили! Но зачем мне параллелизм?

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

Рассмотрим следующий случай 🙌:

Вы находитесь в любимом продуктовом магазине и только что подошли к кассе, но, к сожалению, вас ждет много людей. Для ускорения процесса в магазине открылось еще несколько касс, и у каждого дополнительного кассира своя очередь. Так что вам просто нужно выбрать один. Если у одного из кассиров возникнет техническая проблема или они просто медленные, очередь будет отложена, даже если другие слоты будут свободны.

Очередь одновременных задач спешит на помощь! 💪

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

Ура! 🎉

Давайте рассмотрим вариант использования

На прошлой неделе я работал над расширением Google Chrome, которое прослушивает и скачивает потоки HLS (HTTP Live stream).

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

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

TL; DR: вот код

А теперь давайте рассмотрим это по частям.

1. Обработчик

Этот простой обработчик получает URI из полезной нагрузки, а затем:

  • получает кусок
  • превращает его в каплю
  • генерирует событие redux chunk-ready
  • получает текущее количество готовых кусков
  • проверяет, все ли готово

2. Создайте очередь

Используя обработчик, мы создаем новую очередь с 5 рабочими. Мы возвращаем задачу watcher и канал очереди. Затем мы собираемся запустить (разветвить) задачу наблюдателя, чтобы она начала прослушивать задачи.

3. Продвигайте задачи

Мы сопоставляем все сегменты с поставленной задачей (в возвращенный канал очереди), а затем запускаем все задачи вместе.

4. Подождите, пока все фрагменты будут готовы или действие будет отменено.

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

Вот и все!

Если вы хотите увидеть его вживую, посетите https://github.com/puemos/hls-downloader-chrome-extension и загрузите расширение Chrome.

Надеюсь, вы узнали что-то новое! Если у вас есть какие-либо вопросы, прокомментируйте их ниже, чтобы всем было полезно.