#1 DOM в WebWorker? Как? - Многопоточность и DOM

  Рет қаралды 17,405

JavaScript.Ninja

JavaScript.Ninja

Күн бұрын

Пікірлер: 87
@npokc
@npokc 2 жыл бұрын
Илья, спасибо вам большое за ваш вклад в сообщество! Вы прекрасный человек и специалист! Здоровья вам и мира этому миру!
@Ruletka-systemRu
@Ruletka-systemRu 2 жыл бұрын
Только сегодня вспоминал Вас, давно видео не было, начал волноваться... Берегите себя.
@AntiPlayerBS
@AntiPlayerBS 2 жыл бұрын
Очень актуальная тема. Жду продолжения. Как заблокировать эвентлуп, хотя бы одним из способов, понятно, интересно как его потом разблокировать.
@Jaood_xD
@Jaood_xD 2 жыл бұрын
С помощью раньше упомянутого sharedArrayBuffer. Есть такая замечательная вещь как Atomics, которая одним из методов, а именно wait, позволяет усыпить весь поток в ожидании изменений в буфере.
@mrMettadon
@mrMettadon 2 жыл бұрын
Очень круто, спасибо за видео!
@volodymyrpalamar5515
@volodymyrpalamar5515 2 жыл бұрын
За "покращену" архітектуру лайк )
@melomalo1682
@melomalo1682 2 жыл бұрын
Берегите себя Илья!
@bubblesort6368
@bubblesort6368 2 жыл бұрын
А куда идти за пирожком?)
@popuguytheparrot_
@popuguytheparrot_ 2 жыл бұрын
while c pointer?
@stas-web
@stas-web 2 жыл бұрын
Занятно. Спасибо.
@isfland
@isfland 2 жыл бұрын
Как заблокировать эвентлуп? Через микротаски!
@xxxxPomaHxxxx
@xxxxPomaHxxxx 2 жыл бұрын
Ты так максимум заблокируешь переход на следующую очередь, а не синхронный код.
@isfland
@isfland 2 жыл бұрын
@@xxxxPomaHxxxx function dieLoop() { return Promise.resolve().then(dieLoop)} Эта функция начнет выполняться в стеке вызовов. Когда выполнится весь синхронный код, то начнут выполняться микротаски. Зарезолвится промис, потом здесь же снова вызовется функция и по кругу. Таким образом мы не перейдем на следующий шаг эвентлупа, а навеки застрянем на текущем шагу
@xxxxPomaHxxxx
@xxxxPomaHxxxx 2 жыл бұрын
@@isfland А нам нужно паузить посреди синхронного кода, ваш вариант не поможет в ситуации в видео.
@vladislavstepanov7591
@vladislavstepanov7591 2 жыл бұрын
@@isfland зачем тут микротаски, если также заблокировать можно и обычным стеком? Псевдокод while (waitFor)
@isfland
@isfland 2 жыл бұрын
@@vladislavstepanov7591 согласен, микротаски оверкилл
@alexgribme
@alexgribme 2 жыл бұрын
Если я не ошибаюсь, запуск скриптов в Worker'е с проксированием DOM умела ещё AMP
@qwiting
@qwiting 2 жыл бұрын
А если в функцию добавить setTimeout которая вызывает эту же функцию до тех пор, пока операция не завершилась
@bubblesort6368
@bubblesort6368 2 жыл бұрын
И плодить макротаски?
@qwiting
@qwiting 2 жыл бұрын
@@bubblesort6368 ну да
@bubblesort6368
@bubblesort6368 2 жыл бұрын
@@qwiting но ведь новая макротаска будет запускаться на другом стеке вызова уже и на новом тике ивент лупа, а блокирующая функция так и должна оставаться на том же тике. Без примера кода я слабо представляю как это должно работать.
@qwiting
@qwiting 2 жыл бұрын
@@bubblesort6368 а зачем оставаться на том же тике?
@bubblesort6368
@bubblesort6368 2 жыл бұрын
@@qwiting потому что если в коде будет try catch то он работать не будет так как он связывается по тактам ивент лупа. И есть пример кода? Какой-то пруф о консепт. Я не понимаю как таймаутами можно имитировать синхронный вызов. Ну то есть у нас тайм-аут на третьей строке и как заставить его выполниться раньше чем четвертая строка этой же функции которая уже попала в стек вызова
@liubomyr-peteliuk
@liubomyr-peteliuk 2 жыл бұрын
Яка ситуація у Харкові? Привіт з Франківська)
@vitaliinnest
@vitaliinnest 2 жыл бұрын
Стабильно. Прилеты.
@alexroberto8499
@alexroberto8499 2 жыл бұрын
Можно топорно заблокировать бесконечным циклом с проверкой (прощай CPU). Вообще как то пробовал делать что то похожее на sleep при синхронном исполнении.
@ВитяПолторацкий-ш3ы
@ВитяПолторацкий-ш3ы 2 жыл бұрын
А если что-то пойдёт не так ) будет бобо
@alexroberto8499
@alexroberto8499 2 жыл бұрын
@@ВитяПолторацкий-ш3ы ну это ясно что такое решение не годится :) Просто нужно было озвучить этот вариант.
@KristinaShi
@KristinaShi 2 жыл бұрын
❤️
@АлександрПрозоров-ъ9ь
@АлександрПрозоров-ъ9ь 2 жыл бұрын
Вероятно в итоге все равно потребуется обменяться SharedArrayBuffer и повесить мьютекс на функцию работающую с DOM. Если код из WW хочет получить offsetWidth, а затем, основываясь на этом значении что-то сделать с DOM - эта операция должна быть атомарной (что, если другой поток поменяет ширину элемента в промежутке между обменом сообщениями). Главный поток гарантирует нам атомарность при работе с DOM, а рассмотренном случае мы ее теряем.
@bubblesort6368
@bubblesort6368 2 жыл бұрын
И привет дедлоки) ну вообще не удивительно, что браузеры до сих пор однопоточно с домом работают
@АлександрПрозоров-ъ9ь
@АлександрПрозоров-ъ9ь 2 жыл бұрын
@@bubblesort6368 В контексте задачи Ильи у нас один общий ресурс по сути (DOM), поэтому дедлоку неоткуда взяться. Один поток ждет другой, не заняв ни один из общих ресурсов. Насколько я понимаю/помню видео, может подзабылось уже)
@bubblesort6368
@bubblesort6368 2 жыл бұрын
@@АлександрПрозоров-ъ9ь ну если захватывать весь дом а не ноды отдельно то дедлоков не будет. Я полагал вы хотите лочить более точечно на уровне поддеревьев и узлов. Там две корутины могут циклически завязаться на два элемента дома
@d3i0
@d3i0 2 жыл бұрын
Крутить while в котором проверять что в SharedArrayBuffer появилось значение, которое записывать из основного потока?
@mykhailochernov1222
@mykhailochernov1222 2 жыл бұрын
как вариант крутить while внутри генератора
@d3i0
@d3i0 2 жыл бұрын
@@mykhailochernov1222 что-то я не понял как это поможет, можете объяснить?
@bubblesort6368
@bubblesort6368 2 жыл бұрын
@@d3i0 ничем не поможет. Просто синтаксис другой будет и все) типа вместо while вы будете в for .. of крутить бесконечный список построенный на генераторах
@ВладимирАлексеев-о5и
@ВладимирАлексеев-о5и 2 жыл бұрын
Подумал про последовательные вызовы queueMicrotask()
@sergeyvp
@sergeyvp 2 жыл бұрын
Если потоки могут обмениваться объектами, значит воркер может просто запросить объект, поставить блокировку на изменение этого объекта в основном потоке, сделать всё что нужно и вернуть объект в основной поток сняв блокировку с него. Зачем блокировать эвентлуп?
@JavaScriptNinja
@JavaScriptNinja 2 жыл бұрын
А где я говорил что обмениваются объектами? Я чётко расскащал что там клонирование идёт :)
@sergeyvp
@sergeyvp 2 жыл бұрын
@@JavaScriptNinja 4:07 Склонировали объект и на источник поставили блок, затем внесли изменения в клон и заменили им источник. Зачем блокировать луп?
@yevhenbadorov7961
@yevhenbadorov7961 2 жыл бұрын
@@sergeyvp блокувати треба тому, що операції з DOM синхронні і це дає певні гарантії, на які може очікувати код, який виконується в service worker. Потрібна консистентність
@sergeyvp
@sergeyvp 2 жыл бұрын
@@yevhenbadorov7961 Если блокировать то зачем распараллеливать? Параллельное исполнение как раз нужно чтобы не было никаких блокировок.
@JavaScriptNinja
@JavaScriptNinja 2 жыл бұрын
@@sergeyvp потому что код, написанный НЕ НАМИ понятия не имеет что условный el.offsetHeight АСИНХРОННЫЙ, ну и блоков таких нет )
@mykolakozub2981
@mykolakozub2981 2 жыл бұрын
alert/prompt можливо блокуe чергу. Iлья, дякую за вiдео
@Alendorff
@Alendorff 2 жыл бұрын
Уууу... ну поток блокируется бесконечным циклом хорошо :) можно просто сделать while(waitForReply) какой-нибудь и он должен подвешать поток. А внутри цикла как-то проверять новые сообщения от основного потока в надежде что придет то самое сообщение и разблочит поток. Не знаю даже как еще можно "приостановить" поток. Но сомнительно что бесконечные циклы в фоне хорошая идея. И не совсем понятно как изнутри цикла который заблокировал поток будут выполняться те же слушатели для postmessage. По идее никак если поток блокирован.Такая себе идея получается. Еще думал про какую-нибудь shared memory между основным потоком и воркером чтобы сделать операцию синхронной. Можно было бы в эту сторону покопать. cliff hanger это ты конечно хорошо придумал, заставляет хотя бы немножко подумать над решением, что лучше чем просто его сразу узнать с точки зрения получения информации
@ВитяПолторацкий-ш3ы
@ВитяПолторацкий-ш3ы 2 жыл бұрын
Кроме генераторов в джс ничего нет пока , чтоб это сделать адекватно
@yevhenbadorov7961
@yevhenbadorov7961 2 жыл бұрын
Треба м'ютекс реалізований через shared array buffer, як Тимур реалізовував тут kzbin.info/www/bejne/gH-vo3yKmtubiKs
@jessrabbitxt
@jessrabbitxt 2 жыл бұрын
Похорошел кстати
@offantik
@offantik 2 жыл бұрын
ответ наверное генераторы? так как это единственное что приходит на ум
@mnikk1
@mnikk1 2 жыл бұрын
да, yield
@ILICH1980
@ILICH1980 2 жыл бұрын
интригант )))
@alexeyku8926
@alexeyku8926 2 жыл бұрын
. while(true) // ждём ответа Это анти-паттерн в основном потоке , но в воркерах, почему бы и нет? Конечно же с точки зрения cpu неэффективно и батарейку будет жрать только в путь, но кого это волнует в наше время))
@mnikk1
@mnikk1 2 жыл бұрын
yield
@sergeyvronskiy134
@sergeyvronskiy134 2 жыл бұрын
Очень умный парень, очень много делает для всех, надеюсь ума хватит, чтоб не загребли и не отправили в мясорубку
@antonkolesnikov1001
@antonkolesnikov1001 2 жыл бұрын
До конца не додумал мысль, но вариант такой: под капотом async у нас promise и генераторы. Поэтому возможно что-то похожее.
@dmitriy8735
@dmitriy8735 2 жыл бұрын
Сорян, но произношение слов width, height, query - боль.
@snky_
@snky_ 2 жыл бұрын
Норм произношение. Я бы легко понял что он имел ввиду не глядя в видео и носитель eng поймёт
@404Negative
@404Negative Жыл бұрын
это уроки не по англискому
@mapuaptu
@mapuaptu 2 жыл бұрын
Запустить вызов микротасков бесконечно в зависимости от флага. Потом когда получили обраный ответ снять флаг.
@MrMrZetek
@MrMrZetek 2 жыл бұрын
Сделать бесконечный цикл, который будет проверять пришло ли ответное сообщение, только тогда надо будет использовать этот sharedArrayBuffer объект. Хз, мне кажется может получиться
@dever4eg
@dever4eg 2 жыл бұрын
Спустя пару минут гугления, нашел вот такую штуку: Atomics.wait(), которая позволяет синхронно подождать какой то таймаут. Т.е. мы можем "уснуть" на какое то время, и потом проверить, а не пришло ли уже значение из главного треда. Звучит как рабочий вариант. Ну и еще из глупого решения - сделать бесконечный while, который будет грузить cpu.
@dever4eg
@dever4eg 2 жыл бұрын
И уже после этого я услышал "но только пожалуйста попробуйте не гуглить"
@_diray
@_diray 2 жыл бұрын
Оно как раз таки вместе с бесконечным while и собирается, чтобы дождаться обработки запроса с текущего потока, типа: while(Atomics.wait(int32arr,0,queueToken) !== "ok");
@Alendorff
@Alendorff 2 жыл бұрын
круто, не слышал про атомикс раньше
@isfland
@isfland 2 жыл бұрын
Спасибо что контент снова на русском. Астрологи предсказывают увеличение аудитории в 10 раз
@JavaScriptNinja
@JavaScriptNinja 2 жыл бұрын
А никто не обещал контент только на украинском. Контент который зеркалится с патреона будет на русском
@erjigit17
@erjigit17 2 жыл бұрын
@@JavaScriptNinja давно уже смотрю на украинском, 6 понятливее чем английский индуса.
PROOF JavaScript is a Multi-Threaded language
8:21
Beyond Fireship
Рет қаралды 297 М.
黑天使被操控了#short #angel #clown
00:40
Super Beauty team
Рет қаралды 61 МЛН
Правильный подход к детям
00:18
Beatrise
Рет қаралды 11 МЛН
Как стать ЛУЧШИМ тестировщиком: от учителя до QA-инженера в Т-Банк
1:14:20
Руслан Масленников | Подкаст "экcпириенс"
Рет қаралды 17 М.
Немного о worker’аx​ | Технострим
27:39
Научи Свой Мозг ЛЮБИТЬ Сложную Работу
11:23
Eгор Астахов
Рет қаралды 14 М.
Callback это просто. Разбираемся в callback JavaScript
15:33
WebDev с нуля. Канал Алекса Лущенко
Рет қаралды 76 М.
Node.js is a serious thing now… (2023)
8:18
Code With Ryan
Рет қаралды 665 М.
КАК УСТРОЕН TCP/IP?
31:32
Alek OS
Рет қаралды 271 М.
黑天使被操控了#short #angel #clown
00:40
Super Beauty team
Рет қаралды 61 МЛН