Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Microtasks

HTML-spesifikaation mukaan microtask on: “arkikielinen tapa viitata tehtävään, joka luotiin queue a microtask algorithm -algoritmin kautta” (lähde). Jokaisella event-loopilla — eli window, worker tai worklet — on oma microtask-jononsa. Jonoon lisätyt tehtävät ajetaan osana perform a microtask checkpoint -algoritmia, jota kutsutaan useista paikoista, pääasiallisesti tehtävän ajamisen jälkeen tehtäväjonosta, joka ei ole microtask-jono, ja jokainen kutsu tähän algoritmiin tyhjentää microtask-jonon — ajamalla kaikki siihen asti jonoon lisätyt tehtävät (ilman uudelleensisääntuloisuutta).

Microtask-jono Servossa

MicroTaskQueue on suoraviivainen spesifikaatioon perustuva toteutus: tehtävälista ja boolean uudelleensisääntuloisuuden estämiseksi checkpointissa. Yksi luodaan jokaiselle runtime:lle, mikä vastaa spesifikaatiota, koska runtime luodaan per event-loop. Window event-loopille, joka voi sisältää useita window-objekteja, jono jaetaan kaikkien sen sisältämien GlobalScope:ien kesken. Dedicated workerit käyttävät child-runtime:a, mutta sillä on silti oma microtask-jononsa.

Microtask-jonotus

Tehtävä voidaan jonottaa microtask-jonoon sekä Rustista että JS-moottorista.

  • JS:stä: JS-moottori kutsuu enqueue_promise_job aina, kun sen täytyy jonottaa microtask promise-käsittelijöiden kutsumiseksi. Tämä callback-mekanismi asetetaan kerran per runtime. Tämä tarkoittaa, että promisen ratkaiseminen, joko Rustista tai JS:stä, johtaa tähän callbackiin kutsumiseen ja microtaskin jonotukseen. Tiukasti ottaen microtask jonotetaan silti Rustista.
  • Rustista on useita paikkoja, joista microtaskit jonotetaan eksplisiittisesti “natiivista” Rustista:
    • await a stable state -algoritmin toteuttamiseen script-threadin kautta, ilmeisesti vain script-threadin kautta, mikä tarkoittaa, että worker event-loopit eivät koskaan käytä tätä algoritmia.
    • dom-queuemicrotask -algoritmin toteuttamiseen sekä window- että worker event-loopeissa.
    • Ja useissa muissa paikoissa DOM:issa, jotka kaikki voidaan jäljittää Microtask -enumin variantteihin
    • Microtask voidaan jonottaa vain vaiheista, jotka ajetaan tehtävän sisällä, ei koskaan vaiheista, jotka ajetaan “in-parallel” event-loopin kanssa.

Microtask Checkpointien ajaminen

perform-a-microtask-checkpoint vastaa MicrotaskQueue::checkpoint -metodia, ja sitä kutsutaan useissa kohdissa: