← Назад к вопросам

Как устроен Event Loop?

2.0 Middle🔥 201 комментариев
#Dart#Асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как устроен Event Loop в Dart/Flutter

Event Loop — это ядро асинхронной модели Dart. Он обеспечивает неблокирующее выполнение кода и позволяет приложению обрабатывать множество операций параллельно, хотя выполнение кода остаётся однопоточным.

Архитектура Event Loop

Dart использует две очереди событий:

  1. Event Queue (очередь событий) — содержит операции ввода-вывода, таймеры, сетевые запросы
  2. Microtask Queue (очередь микрозадач) — содержит более приоритетные задачи, которые должны выполниться перед следующим событием

Порядок выполнения

Цикл Event Loop работает в следующем порядке:

  1. Выполни основной код (main) до конца
  2. Выполни все микрозадачи из Microtask Queue (в порядке добавления)
  3. Выполни одно событие из Event Queue
  4. Вернись к шагу 2

Пример с кодом

void main() {
  print("1. Начало");
  
  // Добавляем в Event Queue
  Future(() => print("3. Future"));
  
  // Добавляем в Microtask Queue (выполнится перед Future)
  scheduleMicrotask(() => print("2. Microtask"));
  
  print("4. Конец");
}

// Вывод:
// 1. Начало
// 4. Конец
// 2. Microtask
// 3. Future

Практический пример с async/await

Future<void> demonstrateEventLoop() async {
  print("1. Старт");
  
  await Future.delayed(Duration(milliseconds: 100));
  print("2. После Future.delayed");
  
  scheduleMicrotask(() => print("3. Microtask в конце"));
  
  print("4. Синхронный код после await");
}

void main() {
  demonstrateEventLoop();
  print("5. main завершён");
}

// Вывод:
// 1. Старт
// 5. main завершён
// 2. После Future.delayed
// 4. Синхронный код после await
// 3. Microtask в конце

Применение во Flutter

Понимание Event Loop критично при работе с:

  • setState — изменения будут применены в следующем цикле Event Loop
  • async операции — запросы к API, чтение файлов помещаются в Event Queue
  • анимации — каждый кадр (frame) требует выполнения в Event Loop
  • производительность — долгие синхронные операции блокируют UI

Оптимизация и best practices

Избегай блокирующих операций в основном потоке:

// ❌ Плохо — блокирует UI
void fetchData() {
  final response = http.get(url); // Синхронный вызов
  process(response);
}

// ✅ Хорошо — не блокирует UI
Future<void> fetchData() async {
  final response = await http.get(url); // Асинхронный вызов
  process(response);
}

Используй compute() для тяжелых вычислений:

// Выполнит функцию на отдельном изоляте
final result = await compute(heavyFunction, data);

Ограничивай количество одновременных операций:

final futures = <Future>[];
for (var i = 0; i < 1000; i++) {
  futures.add(fetchItem(i));
}
await Future.wait(futures); // Может быть слишком много

// Лучше использовать concurrency limit
final pool = Pool(5);
for (var i = 0; i < 1000; i++) {
  await pool.withResource(() => fetchItem(i));
}

Заключение

Event Loop — это фундамент асинхронности в Dart. Хорошее понимание его работы позволяет писать отзывчивые приложения, избегать зависаний UI и правильно организовать асинхронный код в Flutter приложениях.

Как устроен Event Loop? | PrepBro