Sobes.tech
Middle+

Objasnite kako funkcioniše Event Loop u kontekstu jezika Dart i frameworka Flutter.

sobes.tech АИ

Одговор од АИ

Dart је једнопоточан, али за обраду асинхроних операција користи Event Loop.

Event Loop се састоји од две главне редове:

  1. Microtask Queue: За високоприоритетне, кратке асинхроне задатке. Извршавају се одмах након завршетка тренутне операције и пре почетка обраде следеће итерације Event Loop.
  2. Event Queue: За спољашње догађаје (као што су I/O, таймери, кориснички унос). Задаци из овог реда се обрађују након што Microtask Queue постане празан.

Процес рада:

  • Главни ток извршава синхронизовани код.
  • При сусрету са асинхроним операцијом (нпр. Future, Stream, таймер), она се региструје и шаље у одговарајући ред.
  • Event Loop стално проверава Microtask Queue. Ако није празна, задаци из ње се извршавају до потпуног испразњења.
  • Затим Event Loop проверава Event Queue. Ако није празна, узима први задатак и извршава га.
  • Овај циклус се понавља док обе редове не постану празне и док не буде асинхроних операција у чекању.

Пример коришћења Future и scheduleMicrotask:

void main() {
  print('1. Почетак main');

  // Додаје микрозадаћу у Microtask Queue
  scheduleMicrotask(() {
    print('3. Микрозадаћа се извршава');
  });

  // Креира асинхрону операцију која ће се додати у Event Queue након завршетка
  Future(() {
    print('4. Future се извршава (из Event Queue)');
  });

  // Додаје микрозадаћу у Microtask Queue
  scheduleMicrotask(() {
    print('5. Друга микрозадаћа се извршава');
  });

  // Креира Future са закашњењем, такође ће се послати у Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Одложени Future се извршава (из Event Queue)');
  });

  print('2. Крај main');
}

// Очекује се следећи редослед извршавања:
// 1. Почетак main
// 2. Крај main
// 3. Микрозадаћа се извршава
// 5. Друга микрозадаћа се извршава
// 4. Future се извршава (из Event Queue)
// 6. Одложени Future се извршава (из Event Queue)

У Flutter-у, Event Loop управља извршавањем задатака UI (поновно цртање widget-ова), обрадом жестока, мрежним захтевима и другим асинхроним операцијама, обезбеђујући глатак рад апликације без блокирања UI. Важни задаци Flutter-а (нпр. планирање кадрова за рендеринг) често користе Microtask Queue за постизање вишег приоритета.