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

Поделиться
HTML-код
  • Опубликовано: 2 авг 2022
  • Разговариваем о 🎉 Partytown partytown.builder.io/
    Но разговоры заведут нас совсем не туда, куда ожидалось...
    Дата выхода на Patreon: 3 августа 2022
    Продолжение выйдет на Patreon в тирах "адепт" ($10) и выше уже завтра!
    Присоединяйтесь! / javascriptninja

Комментарии • 87

  • @npokc
    @npokc Год назад +31

    Илья, спасибо вам большое за ваш вклад в сообщество! Вы прекрасный человек и специалист! Здоровья вам и мира этому миру!

  • @Ruletka-systemRu
    @Ruletka-systemRu Год назад +5

    Только сегодня вспоминал Вас, давно видео не было, начал волноваться... Берегите себя.

  • @mrMettadon
    @mrMettadon Год назад

    Очень круто, спасибо за видео!

  • @volodymyrpalamar5515
    @volodymyrpalamar5515 Год назад +2

    За "покращену" архітектуру лайк )

  • @stas-web
    @stas-web Год назад

    Занятно. Спасибо.

  • @melomalo1682
    @melomalo1682 Год назад

    Берегите себя Илья!

  • @KristinaShi
    @KristinaShi Год назад +1

    ❤️

  • @AntiPlayerBS
    @AntiPlayerBS Год назад +8

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

    • @Jaood_xD
      @Jaood_xD Год назад +1

      С помощью раньше упомянутого sharedArrayBuffer. Есть такая замечательная вещь как Atomics, которая одним из методов, а именно wait, позволяет усыпить весь поток в ожидании изменений в буфере.

  • @popuguytheparrot_
    @popuguytheparrot_ Год назад

    while c pointer?

  • @alexgribme
    @alexgribme Год назад

    Если я не ошибаюсь, запуск скриптов в Worker'е с проксированием DOM умела ещё AMP

  • @bubblesort6368
    @bubblesort6368 Год назад

    А куда идти за пирожком?)

  • @daveyjonesx
    @daveyjonesx Год назад

    Похорошел кстати

  • @user-vy7dz3qz2m
    @user-vy7dz3qz2m Год назад

    Подумал про последовательные вызовы queueMicrotask()

  • @liubomyr-peteliuk
    @liubomyr-peteliuk Год назад +2

    Яка ситуація у Харкові? Привіт з Франківська)

    • @vitaliinnest
      @vitaliinnest Год назад

      Стабильно. Прилеты.

  • @qwiting
    @qwiting Год назад

    А если в функцию добавить setTimeout которая вызывает эту же функцию до тех пор, пока операция не завершилась

    • @bubblesort6368
      @bubblesort6368 Год назад

      И плодить макротаски?

    • @qwiting
      @qwiting Год назад

      @@bubblesort6368 ну да

    • @bubblesort6368
      @bubblesort6368 Год назад

      @@qwiting но ведь новая макротаска будет запускаться на другом стеке вызова уже и на новом тике ивент лупа, а блокирующая функция так и должна оставаться на том же тике. Без примера кода я слабо представляю как это должно работать.

    • @qwiting
      @qwiting Год назад

      @@bubblesort6368 а зачем оставаться на том же тике?

    • @bubblesort6368
      @bubblesort6368 Год назад

      @@qwiting потому что если в коде будет try catch то он работать не будет так как он связывается по тактам ивент лупа. И есть пример кода? Какой-то пруф о консепт. Я не понимаю как таймаутами можно имитировать синхронный вызов. Ну то есть у нас тайм-аут на третьей строке и как заставить его выполниться раньше чем четвертая строка этой же функции которая уже попала в стек вызова

  • @isfland
    @isfland Год назад +1

    Как заблокировать эвентлуп? Через микротаски!

    • @xxxxPomaHxxxx
      @xxxxPomaHxxxx Год назад +1

      Ты так максимум заблокируешь переход на следующую очередь, а не синхронный код.

    • @isfland
      @isfland Год назад +1

      @@xxxxPomaHxxxx function dieLoop() { return Promise.resolve().then(dieLoop)}
      Эта функция начнет выполняться в стеке вызовов. Когда выполнится весь синхронный код, то начнут выполняться микротаски. Зарезолвится промис, потом здесь же снова вызовется функция и по кругу. Таким образом мы не перейдем на следующий шаг эвентлупа, а навеки застрянем на текущем шагу

    • @xxxxPomaHxxxx
      @xxxxPomaHxxxx Год назад +1

      @@isfland А нам нужно паузить посреди синхронного кода, ваш вариант не поможет в ситуации в видео.

    • @vladislavstepanov7591
      @vladislavstepanov7591 Год назад +1

      @@isfland зачем тут микротаски, если также заблокировать можно и обычным стеком? Псевдокод while (waitFor)

    • @isfland
      @isfland Год назад

      @@vladislavstepanov7591 согласен, микротаски оверкилл

  • @mnik0128
    @mnik0128 Год назад

    yield

  • @ILICH1980
    @ILICH1980 Год назад +3

    интригант )))

  • @d3i0
    @d3i0 Год назад

    Крутить while в котором проверять что в SharedArrayBuffer появилось значение, которое записывать из основного потока?

    • @mykhailochernov1222
      @mykhailochernov1222 Год назад

      как вариант крутить while внутри генератора

    • @d3i0
      @d3i0 Год назад

      @@mykhailochernov1222 что-то я не понял как это поможет, можете объяснить?

    • @bubblesort6368
      @bubblesort6368 Год назад +1

      @@d3i0 ничем не поможет. Просто синтаксис другой будет и все) типа вместо while вы будете в for .. of крутить бесконечный список построенный на генераторах

  • @user-fj3lc5nb6d
    @user-fj3lc5nb6d Год назад

    Кроме генераторов в джс ничего нет пока , чтоб это сделать адекватно

  • @alexroberto8499
    @alexroberto8499 Год назад +4

    Можно топорно заблокировать бесконечным циклом с проверкой (прощай CPU). Вообще как то пробовал делать что то похожее на sleep при синхронном исполнении.

    • @user-fj3lc5nb6d
      @user-fj3lc5nb6d Год назад

      А если что-то пойдёт не так ) будет бобо

    • @alexroberto8499
      @alexroberto8499 Год назад

      @@user-fj3lc5nb6d ну это ясно что такое решение не годится :) Просто нужно было озвучить этот вариант.

  • @mykolakozub2981
    @mykolakozub2981 Год назад

    alert/prompt можливо блокуe чергу. Iлья, дякую за вiдео

  • @Alendorff
    @Alendorff Год назад +1

    Уууу... ну поток блокируется бесконечным циклом хорошо :) можно просто сделать while(waitForReply) какой-нибудь и он должен подвешать поток. А внутри цикла как-то проверять новые сообщения от основного потока в надежде что придет то самое сообщение и разблочит поток. Не знаю даже как еще можно "приостановить" поток. Но сомнительно что бесконечные циклы в фоне хорошая идея. И не совсем понятно как изнутри цикла который заблокировал поток будут выполняться те же слушатели для postmessage. По идее никак если поток блокирован.Такая себе идея получается.
    Еще думал про какую-нибудь shared memory между основным потоком и воркером чтобы сделать операцию синхронной. Можно было бы в эту сторону покопать.
    cliff hanger это ты конечно хорошо придумал, заставляет хотя бы немножко подумать над решением, что лучше чем просто его сразу узнать с точки зрения получения информации

  • @sergeyvp
    @sergeyvp Год назад

    Если потоки могут обмениваться объектами, значит воркер может просто запросить объект, поставить блокировку на изменение этого объекта в основном потоке, сделать всё что нужно и вернуть объект в основной поток сняв блокировку с него. Зачем блокировать эвентлуп?

    • @JavaScriptNinja
      @JavaScriptNinja  Год назад

      А где я говорил что обмениваются объектами? Я чётко расскащал что там клонирование идёт :)

    • @sergeyvp
      @sergeyvp Год назад

      @@JavaScriptNinja 4:07 Склонировали объект и на источник поставили блок, затем внесли изменения в клон и заменили им источник. Зачем блокировать луп?

    • @yevhenbadorov7961
      @yevhenbadorov7961 Год назад +2

      @@sergeyvp блокувати треба тому, що операції з DOM синхронні і це дає певні гарантії, на які може очікувати код, який виконується в service worker. Потрібна консистентність

    • @sergeyvp
      @sergeyvp Год назад

      @@yevhenbadorov7961 Если блокировать то зачем распараллеливать? Параллельное исполнение как раз нужно чтобы не было никаких блокировок.

    • @JavaScriptNinja
      @JavaScriptNinja  Год назад +1

      @@sergeyvp потому что код, написанный НЕ НАМИ понятия не имеет что условный el.offsetHeight АСИНХРОННЫЙ, ну и блоков таких нет )

  • @yevhenbadorov7961
    @yevhenbadorov7961 Год назад +1

    Треба м'ютекс реалізований через shared array buffer, як Тимур реалізовував тут ruclips.net/video/JNLrITevhRI/видео.html

  • @user-ec8mu9qk5i
    @user-ec8mu9qk5i Год назад +3

    Вероятно в итоге все равно потребуется обменяться SharedArrayBuffer и повесить мьютекс на функцию работающую с DOM. Если код из WW хочет получить offsetWidth, а затем, основываясь на этом значении что-то сделать с DOM - эта операция должна быть атомарной (что, если другой поток поменяет ширину элемента в промежутке между обменом сообщениями). Главный поток гарантирует нам атомарность при работе с DOM, а рассмотренном случае мы ее теряем.

    • @bubblesort6368
      @bubblesort6368 Год назад

      И привет дедлоки) ну вообще не удивительно, что браузеры до сих пор однопоточно с домом работают

    • @user-ec8mu9qk5i
      @user-ec8mu9qk5i Год назад

      @@bubblesort6368 В контексте задачи Ильи у нас один общий ресурс по сути (DOM), поэтому дедлоку неоткуда взяться. Один поток ждет другой, не заняв ни один из общих ресурсов. Насколько я понимаю/помню видео, может подзабылось уже)

    • @bubblesort6368
      @bubblesort6368 Год назад

      @@user-ec8mu9qk5i ну если захватывать весь дом а не ноды отдельно то дедлоков не будет. Я полагал вы хотите лочить более точечно на уровне поддеревьев и узлов. Там две корутины могут циклически завязаться на два элемента дома

  • @sergeyvronskiy134
    @sergeyvronskiy134 Год назад

    Очень умный парень, очень много делает для всех, надеюсь ума хватит, чтоб не загребли и не отправили в мясорубку

  • @alexeyku8926
    @alexeyku8926 Год назад

    . while(true) // ждём ответа
    Это анти-паттерн в основном потоке , но в воркерах, почему бы и нет? Конечно же с точки зрения cpu неэффективно и батарейку будет жрать только в путь, но кого это волнует в наше время))

  • @antonkolesnikov1001
    @antonkolesnikov1001 Год назад

    До конца не додумал мысль, но вариант такой: под капотом async у нас promise и генераторы. Поэтому возможно что-то похожее.

  • @offantik
    @offantik Год назад +3

    ответ наверное генераторы?
    так как это единственное что приходит на ум

  • @mapuaptu
    @mapuaptu Год назад

    Запустить вызов микротасков бесконечно в зависимости от флага. Потом когда получили обраный ответ снять флаг.

  • @MrMrZetek
    @MrMrZetek Год назад

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

  • @dmitriy8735
    @dmitriy8735 Год назад +1

    Сорян, но произношение слов width, height, query - боль.

    • @snky_
      @snky_ Год назад

      Норм произношение. Я бы легко понял что он имел ввиду не глядя в видео и носитель eng поймёт

    • @404Negative
      @404Negative Год назад

      это уроки не по англискому

  • @isfland
    @isfland Год назад +1

    Спасибо что контент снова на русском. Астрологи предсказывают увеличение аудитории в 10 раз

    • @JavaScriptNinja
      @JavaScriptNinja  Год назад +3

      А никто не обещал контент только на украинском. Контент который зеркалится с патреона будет на русском

    • @erjigit17
      @erjigit17 Год назад +1

      @@JavaScriptNinja давно уже смотрю на украинском, 6 понятливее чем английский индуса.

  • @dever4eg
    @dever4eg Год назад +2

    Спустя пару минут гугления, нашел вот такую штуку: Atomics.wait(), которая позволяет синхронно подождать какой то таймаут. Т.е. мы можем "уснуть" на какое то время, и потом проверить, а не пришло ли уже значение из главного треда. Звучит как рабочий вариант. Ну и еще из глупого решения - сделать бесконечный while, который будет грузить cpu.

    • @dever4eg
      @dever4eg Год назад

      И уже после этого я услышал "но только пожалуйста попробуйте не гуглить"

    • @_diray
      @_diray Год назад +1

      Оно как раз таки вместе с бесконечным while и собирается, чтобы дождаться обработки запроса с текущего потока, типа:
      while(Atomics.wait(int32arr,0,queueToken) !== "ok");

    • @Alendorff
      @Alendorff Год назад +2

      круто, не слышал про атомикс раньше