Sobes.tech
Middle+

Обяснете как работи Event Loop в контекста на езика Dart и фреймуърка Flutter.

sobes.tech AI

Отговор от AI

Dart е еднопоточен (single-threaded), но използва Event Loop за управление на асинхронните операции.

Event Loop се състои от две основни опашки:

  1. Microtask Queue: за задачи с висок приоритет и кратки асинхронни задачи. Те се изпълняват веднага след завършването на текущата операция и преди започването на следващата итерация на Event Loop.
  2. Event Queue: за външни събития (като I/O, таймери, въвеждане от потребителя). Задачите от тази опашка се обработват след като Microtask Queue стане празна.

Процес на работа:

  • Основният нишка изпълнява синхронен код.
  • Когато срещне асинхронна операция (например, Future, Stream, таймер), тя се регистрира и се изпраща към съответната опашка.
  • Event Loop постоянно проверява Microtask Queue. Ако не е празна, изпълнява задачите ѝ, докато не стане празна.
  • След това проверява Event Queue. Ако не е празна, взема първата задача и я изпълнява.
  • Този цикъл се повтаря, докато и двете опашки не станат празни и няма повече асинхронни операции в очакване.

Пример за използване на Future и scheduleMicrotask:

void main() {
  print('1. Начало на main');

  // Добавяне на микро задача към Microtask Queue
  scheduleMicrotask(() {
    print('3. Микро задача се изпълнява');
  });

  // Създаване на асинхронна операция, която ще бъде добавена към Event Queue след завършване
  Future(() {
    print('4. Future се изпълнява (от Event 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)