Разница между microtask и macrotask в рамках цикла событий контекста



Я только что закончил читать спецификацию Promises/A+ и наткнулся на термины microtask и macrotask: см. http://promisesaplus.com/#notes



Я никогда не слышал об этих терминах раньше, и теперь мне любопытно, какая разница может быть?



Я уже пытался найти некоторую информацию в интернете, но все, что я нашел это сообщение из w3.org архивы (что не объясняет мне разницу): http://lists.w3.org/Archives/Public/public-nextweb/2013Jul/0018.html



кроме того, я нашел модуль npm под названием "macrotask":https://www.npmjs.org/package/macrotask
Опять же, не уточняется, в чем именно заключается разница.



все, что я знаю, что это имеет какое-то отношение к циклу событий, как описано в https://html.spec.whatwg.org/multipage/webappapis.html#task-queue
и https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint



Я знаю, что теоретически я должен быть в состоянии извлечь различия сам, учитывая эту спецификацию WHATWG. Но я уверен, что другие могли бы также извлечь выгоду из короткого объяснения, данного экспертом.

832   3  

3 ответов:

один обход цикла событий будет иметь ровно задача обрабатывается из очереди macrotask (эта очередь просто называют задач очередь на спецификация WHATWG). После завершения этой макрозадачи все доступные microtasks будет обработано, а именно в рамках того же цикла обхода. Пока эти микрозадачи обрабатываются, они могут поставить в очередь еще больше микрозадач, которые будут выполняться одна за другой, пока очередь микрозадач исчерпана.

каковы практические последствия этого?

Если a microtask рекурсивно ставит в очередь другие микрозадачи, это может занять много времени, пока не будет обработана следующая макрозадача. Это означает, что вы можете получить заблокированный пользовательский интерфейс или некоторые законченные операции ввода-вывода в вашем приложении.

однако, по крайней мере, относительно узла.процесс в JS это.функция nextTick (которая ставит в очередь microtasks), есть встроенный защита от такой блокировки с помощью процесса.макстикдепт. Это значение имеет значение по умолчанию 1000, сокращая дальнейшую обработку microtasks после достижения этого предела, который позволяет следующее macrotask должны быть обработаны)

так когда использовать что?

в принципе, использовать microtasks когда вам нужно делать вещи асинхронно синхронно (т. е. когда вы скажете выполните эту (микро -) задачу в наиболее ближайшее будущее). В противном случае, придерживайтесь macrotasks.

примеры

macrotasks: setTimeout, setInterval, setImmediate, requestAnimationFrame, I/ O, UI rendering
microtasks:

Я написал сообщение об этом, включая интерактивные примеры https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

обновление: я также говорил об этом https://www.youtube.com/watch?v=cCOL7MC4Pl0. речь пойдет более подробно, в том числе о том, как задачи и микрозадачи взаимодействуют с рендерингом.

Основные понятия spec:

  • цикл обработки событий имеет одну или несколько очередей задач.(очередь задач-это очередь макротасков)
  • каждый цикл событий имеет очередь микрозадач.
  • очередь задач = очередь макротасков != очередь микрозадач
  • задача может быть толкнул в очереди macrotask,или очереди microtask
  • когда задача помещается в очередь (микро / макрос), мы имеем в виду, что подготовка работы завершена, поэтому задача может быть выполнена сейчас.

и модель процесса цикла событий выглядит следующим образом:

, когда стек вызовов пусто, делаем шаги -

  1. выберите самую старую задачу (задача A) в очередях задач
  2. если задача A имеет значение null(означает, что очереди задач пусты), перейдите к шагу 6
  3. установите "текущая задача" в "Задача A"
  4. выполнить "task A"(означает запустить функцию обратного вызова)
  5. установить "текущая задача" в значение null, удалить " задача А"
  6. выполнить очереди microtask
    • (a).выберите самую старую задачу (задача x) в очереди микрозадач
    • (b).если задачу х является нулем(очередей microtask пуст),перейти к шагу (г)
    • (c).установите "текущая задача" в "Задача x"
    • (d).выполнить "задачу х"
    • (e).установите для параметра" текущая задача "значение null, удалите "задача x"
    • (f).выберите следующую самую старую задачу в очереди микрозадач, перейдите к шагу (b)
    • (g).отделка microtask очередь;
  7. перейти к шагу 1.

упрощенная модель процесса выглядит следующим образом:

  1. запустите самую старую задачу в очереди макротасков, а затем удалите ее.
  2. запустите все доступные задачи в очереди микрозадач, а затем удалите их.
  3. следующий раунд: запустите следующую задачу в очереди макротасков (шаг перехода 2)

что-то помню:

  1. при выполнении задачи (в очереди макротасков) могут возникать новые события registered.So могут быть созданы новые задачи.Ниже приведены две новые созданные задачи:
    • обещали.тогда обратный вызов () - это задача
      • promiseA разрешен / отклонен: задача будет помещена в очередь микрозадач в текущем цикле цикла событий.
      • обещали ожидает: задача будет толкнул в очереди microtask в будущем раунде цикл событий(может быть следующий раунд)
    • функции setTimeout(обратного вызова,н) с обратного вызова, является задача,и будет выдвинут в очередь макротасков, даже n равно 0;
  2. задача в очереди микрозадач будет выполняться в текущем раунде, в то время как задача в очереди макрозадач должна ждать следующего раунда цикла событий.
  3. мы все знаем обратный вызов "click","scroll","ajax", "setTimeout"... это задачи, однако мы также должны помнить, что JS-коды в целом в теге script-это тоже задача (макротаска).

Comments

    Ничего не найдено.