Sobes.tech
Middle+

Paaiškinkite, kaip veikia Event Loop Dart kalbos ir Flutter karkaso kontekste.

sobes.tech AI

Atsakymas iš AI

Dart yra viengubas, tačiau asinchroninių operacijų apdorojimui naudoja Event Loop.

Event Loop sudarytas iš dviejų pagrindinių eilių:

  1. Microtask Queue: aukšto prioriteto, trumpų asinchroninių užduočių eilė. Jos vykdomos iškart po esamos operacijos pabaigos ir prieš pradedant kitą ciklo iteraciją.
  2. Event Queue: išoriniai įvykiai (pvz., I/O, laikmačiai, naudotojo įvestis). Užduotys iš šios eilės vykdomos po to, kai Microtask Queue tampa tuščia.

Darbo procesas:

  • Pagrindinis srautas vykdo sinchroninį kodą.
  • Susidūrus su asinchronine operacija (pvz., Future, Stream, laikmatis), ji registruojama ir siunčiama į atitinkamą eilę.
  • Event Loop nuolat tikrina Microtask Queue. Jei ji nėra tuščia, užduotys iš jos vykdomos iki pilno ištuštinimo.
  • Tada Event Loop tikrina Event Queue. Jei ji nėra tuščia, paimama pirmoji užduotis ir vykdoma.
  • Šis ciklas kartojasi, kol abi eilės tampa tuščios ir nėra laukiančių asinchroninių operacijų.

Pavyzdys naudojant Future ir scheduleMicrotask:

void main() {
  print('1. Pradžia main');

  // Prideda mikroužduotį į Microtask Queue
  scheduleMicrotask(() {
    print('3. Mikroužduotis vykdoma');
  });

  // Sukuria asinchroninę operaciją, kuri bus pridėta į Event Queue po jos pabaigos
  Future(() {
    print('4. Future vykdoma (iš Event Queue)');
  });

  // Prideda kitą mikroužduotį
  scheduleMicrotask(() {
    print('5. Antroji mikroužduotis vykdoma');
  });

  // Sukuria vėluojantį Future, kuris taip pat bus išsiųstas į Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Atidėtas Future vykdomas (iš Event Queue)');
  });

  print('2. Pabaiga main');
}

// Tikėtinas vykdymo tvarkaraštis:
// 1. Pradžia main
// 2. Pabaiga main
// 3. Mikroužduotis vykdoma
// 5. Antroji mikroužduotis vykdoma
// 4. Future vykdoma (iš Event Queue)
// 6. Atidėtas Future vykdoma (iš Event Queue)

Flutter'e Event Loop valdo UI užduočių vykdymą (widget'ų perpiešimą), gestų apdorojimą, tinklo užklausas ir kitas asinchronines operacijas, užtikrindamas sklandų programos veikimą be UI užšalimo. Svarbios Flutter užduotys (pvz., rėmo planavimas) dažnai naudoja Microtask Queue, siekdamos didesnio prioriteto.