Конкурентная асинхронная очередь на JavaScript

  Рет қаралды 6,126

Timur Shemsedinov

Timur Shemsedinov

Күн бұрын

Пікірлер: 16
@TimurSevimli
@TimurSevimli Жыл бұрын
Спасибо большое за лекцию Тимур Гафарович! После лекции голова разболелась 😅
@СергейДидковский-ч6в
@СергейДидковский-ч6в 3 жыл бұрын
Для очереди лучше использовать pop + unshift чем shift + push. pop забирает только последний элемент, shift - двигает все. Важно, чтобы очередь могла быстро очищаться. Разница в производительности может быть на пару порядков.
@TimurShemsedinov
@TimurShemsedinov 3 жыл бұрын
В js массивы сделаны как списки, поэтому, скорее всего, разницы ни какой, в списках элементы не передвигаются. Но без эксперимента это нельзя утверждать. Да и то, эксперимент не будет иметь силы, как только обновится витуальная машина js. В нашем случае это v8, а мы знаем, что v8, это просто библиотека всяческих оптимизаций и неочевидных вещей, и может менять свое поведение не так, как мы этого ожидаем.
@СергейДидковский-ч6в
@СергейДидковский-ч6в 3 жыл бұрын
@@TimurShemsedinov Тестировал в реализации очереди - быстрее, значительно. Честно сказать, заметил совершенно случайно, но эффект оказался значимым.
@oleg_shulga
@oleg_shulga Жыл бұрын
Спасибо, отличное видео.
@taras7844
@taras7844 Жыл бұрын
Початкова реалізація функції drain призводить до того, що функція викликається кожного разу, коли оброблюється завдання і зменшується count задач до 0. Це означає, що коли є задачі у черзі, які ще не були взяті на виконання, а поточна задача завершилась, функція drain все одно буде викликана. Тому у вашому виводі в консоль drain друкується після кожної завершеної задачі. Проблема пов'язана з тим, що функція drain спрацьовує не тільки тоді, коли всі задачі в черзі були виконані, але й кожного разу, коли завершується обробка окремої задачі. Очікувана поведінка для функції drain, як правило, полягає в тому, що вона повинна викликатися лише один раз, коли всі задачі в черзі були виконані. finish(err, res) { const { onFailure, onSuccess, onDone, onDrain } = this; if (err) { if (onFailure) onFailure(err, res); } else if (onSuccess) { onSuccess(res); } if (onDone) onDone(err, res); if (this.count === 0 && this.waiting.length === 0 && onDrain) onDrain(); } drain викликається тільки тоді, коли всі задачі були оброблені і черга порожня
@drmonochromer
@drmonochromer 4 жыл бұрын
Спасибо! А какие есть способы ограничения непрерывного заполнения очереди ожидания `waiting`? Например, мне нужно обрабатывать файлы, ссылки на которые прилетают из стороннего Readable Stream.
@TimurShemsedinov
@TimurShemsedinov 4 жыл бұрын
Асинхронная очередь или семафор со счетчиком
@HelloGoodbye-f6q
@HelloGoodbye-f6q 2 жыл бұрын
🤯
@TimurSevimli
@TimurSevimli Жыл бұрын
Я повторно смотрю лекцию и возникло такой вопрос. Как мы можем конкретно определится какое количества каналов требует наша приложение что бы не перегружалась ?
@TimurShemsedinov
@TimurShemsedinov Жыл бұрын
К сожалению опытным путем и интуицией
@igorsavelev9013
@igorsavelev9013 2 жыл бұрын
а есть где-то в лекциях пример использования данной абстракции?
@TimurSevimli
@TimurSevimli Жыл бұрын
Однажды писал web-scraper и хотел что бы он параллельно собирал данные из сайтов которые передано. Сделал параллельно что бы не ожидать отработку каждого запроса что бы отправить новый запрос. Но в этом случае столкнулся что одно временно отправлялась очень много запросов и из за такого большого обьема ожидании ответов я не мог получать ответ от серверов. Пришлось брать готовую библиотеку из npm и ограничить отработку именно как в этой лекции, так как не знал такие вещи как конкурентных очередей. Но еще в конце лекции рассказываются тоже примеры.
@dimitro.cardellini
@dimitro.cardellini Жыл бұрын
Одже ... 1. з таймоутом на onProcess без abortController-а все погано. Таска все одно виконається, але замість результатів прилетить timeout error. У випадку, коли йде лише читання, то прзведе до тимчасового використання зайвих ресурсів, що потім прибере коллектор (проте, якщо криво працює сама onProcess, то може і не прибере). У випадку запису даних, то все може будти пагано, і у подальшому вимагати втручання людей до вирішення ситуації (от платіж у нвс затаймаутився, а ми просто не сказали, що він пройшов, а гроші списались, а ордер не підтверджено). Я б все ж таки з черги би цю функціональність прибрав би. Не може черга коректно цей timeout опрацювати 2. спроба відрефакторити той код, навела мене на думку, що все ж таки там вирішується дві задачі одразу: Задача #1: керування черговістю викликів функції onProcessи (власне побудова такої черги, пріоритиети, фактори, таймаут очікування і тп) Задача #2: нагляд за асінхронною функцією (observation over the async function) Власне тому, що дві задачі -- то ця реалізація Concurrent Queue не дорівнює Observables. Обидві задачі окремо вирішуються створенням декораторів для асинхроних функцій, а вся задача -- композиціює цих декораторів І про код. Там є пулл, що відокремлює білдер та власне чергу -- дуже раджу його роздивитись та використати. Краще мати дві прості речі, ніж одну складну.
@taras7844
@taras7844 Жыл бұрын
Тайм коди: 01:50 - Інтродукція до асинхронної черги 10:15 - Розширюємо функціональність: додавання таймаутів до черги 24:28 - Керування потоком: додавання паузи та відновлення 30:51 - Підтримка пріоритетів: як розподіляти завдання за пріоритетом 35:00 - Розробка методу pipe для керування потоком даних 42:25 - Ідеї для подальшого розвитку: як ще можна розширити нашу асинхронну чергу"
Фасад - петтерн для скрытия сложности
55:03
Timur Shemsedinov
Рет қаралды 4,4 М.
Интроспекция и рефлексия в JavaScript
1:02:33
Timur Shemsedinov
Рет қаралды 6 М.
The IMPOSSIBLE Puzzle..
00:55
Stokes Twins
Рет қаралды 174 МЛН
How Many Balloons To Make A Store Fly?
00:22
MrBeast
Рет қаралды 127 МЛН
If people acted like cats 🙀😹 LeoNata family #shorts
00:22
LeoNata Family
Рет қаралды 17 МЛН
How To Choose Mac N Cheese Date Night.. 🧀
00:58
Jojo Sim
Рет қаралды 93 МЛН
Почему Node.js такая быстрая, если тред всего один?
14:38
devschacht “Девшахта”
Рет қаралды 101 М.
Асинхронность на RxJS и потоки событий
38:19
Timur Shemsedinov
Рет қаралды 10 М.
EventEmitter на JavaScript. #ДавайЗакодим
16:10
Первый файл комом
Рет қаралды 2,8 М.
Асинхронные адаптеры: promisify, callbackify, asyncify...
20:45
The IMPOSSIBLE Puzzle..
00:55
Stokes Twins
Рет қаралды 174 МЛН