Что такое Event Loop в Dart?

«Что такое Event Loop в Dart?» — вопрос из категории Асинхронность, который задают на 70% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Event Loop — это механизм, который управляет выполнением асинхронного кода в Dart. Он работает в рамках одного изолята (isolate) и обеспечивает неблокирующую обработку операций, таких как ввод-вывод (I/O), таймеры или жесты пользователя.

Основные компоненты и порядок работы:

  1. Синхронный код: Выполняется сразу и до конца.
  2. Очередь микрозадач (Microtask Queue): Обрабатывается перед очередью событий. Сюда попадают задачи из scheduleMicrotask() и завершения Future (через .then() или await).
  3. Очередь событий (Event Queue): Сюда попадают «внешние» события: таймеры (Future.delayed), операции ввода-вывода (ответы от сети, чтение файлов), взаимодействия с UI.

Алгоритм Event Loop:

while (true) {
  // 1. Выполнить все микрозадачи из очереди микрозадач.
  while (microtaskQueue.isNotEmpty) {
    microtaskQueue.removeFirst().call();
  }
  // 2. Если очередь событий не пуста, выполнить одно событие.
  if (eventQueue.isNotEmpty) {
    eventQueue.removeFirst().call();
  }
  // 3. Если обе очереди пусты — ожидать новых событий.
}

Практический пример, демонстрирующий порядок:

void main() {
  print('1. Синхронный код');

  Future(() => print('3. Event Queue (Future)')).then((_) {
    print('4. Microtask из .then() предыдущего Future');
  });

  scheduleMicrotask(() => print('2. Microtask Queue'));

  print('5. Снова синхронный код');
}

Вывод будет:

1. Синхронный код
5. Снова синхронный код
2. Microtask Queue
3. Event Queue (Future)
4. Microtask из .then() предыдущего Future

Зачем это важно в Flutter? Понимание Event Loop помогает писать отзывчивые UI-приложения. Длительные синхронные операции «замораживают» интерфейс, потому что блокируют цикл событий. Поэтому тяжелые вычисления нужно выносить в отдельный изолят или разбивать на асинхронные задачи.

Видео-ответы