Разница между 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. Но я уверен, что другие могли бы также извлечь выгоду из короткого объяснения, данного экспертом.
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
- когда задача помещается в очередь (микро / макрос), мы имеем в виду, что подготовка работы завершена, поэтому задача может быть выполнена сейчас.
и модель процесса цикла событий выглядит следующим образом:
, когда стек вызовов пусто, делаем шаги -
- выберите самую старую задачу (задача A) в очередях задач
- если задача A имеет значение null(означает, что очереди задач пусты), перейдите к шагу 6
- установите "текущая задача" в "Задача A"
- выполнить "task A"(означает запустить функцию обратного вызова)
- установить "текущая задача" в значение null, удалить " задача А"
- выполнить очереди microtask
- (a).выберите самую старую задачу (задача x) в очереди микрозадач
- (b).если задачу х является нулем(очередей microtask пуст),перейти к шагу (г)
- (c).установите "текущая задача" в "Задача x"
- (d).выполнить "задачу х"
- (e).установите для параметра" текущая задача "значение null, удалите "задача x"
- (f).выберите следующую самую старую задачу в очереди микрозадач, перейдите к шагу (b)
- (g).отделка microtask очередь;
- перейти к шагу 1.
упрощенная модель процесса выглядит следующим образом:
- запустите самую старую задачу в очереди макротасков, а затем удалите ее.
- запустите все доступные задачи в очереди микрозадач, а затем удалите их.
- следующий раунд: запустите следующую задачу в очереди макротасков (шаг перехода 2)
что-то помню:
- при выполнении задачи (в очереди макротасков) могут возникать новые события registered.So могут быть созданы новые задачи.Ниже приведены две новые созданные задачи:
- обещали.тогда обратный вызов () - это задача
- promiseA разрешен / отклонен: задача будет помещена в очередь микрозадач в текущем цикле цикла событий.
- обещали ожидает: задача будет толкнул в очереди microtask в будущем раунде цикл событий(может быть следующий раунд)
- функции setTimeout(обратного вызова,н) с обратного вызова, является задача,и будет выдвинут в очередь макротасков, даже n равно 0;
- задача в очереди микрозадач будет выполняться в текущем раунде, в то время как задача в очереди макрозадач должна ждать следующего раунда цикла событий.
- мы все знаем обратный вызов "click","scroll","ajax", "setTimeout"... это задачи, однако мы также должны помнить, что JS-коды в целом в теге script-это тоже задача (макротаска).
Comments