Dart однопоточен, но для обработки асинхронных операций использует Event Loop.
Event Loop состоит из двух основных очередей:
- Microtask Queue: Для высокоприоритетных, коротких асинхронных задач. Выполняются сразу после завершения текущей операции и до начала обработки следующей итерации Event Loop.
- Event Queue: Для внешних событий (таких как I/O, таймеры, пользовательский ввод). Задачи из этой очереди обрабатываются после того, как Microtask Queue становится пустой.
Процесс работы:
- Основной поток выполняет синхронный код.
- При встрече асинхронной операции (например,
Future, Stream, таймер), она регистрируется и отправляется в соответствующую очередь.
- Event Loop постоянно проверяет Microtask Queue. Если она не пуста, задачи из нее выполняются до полного опустошения.
- Затем Event Loop проверяет Event Queue. Если она не пуста, из нее берется первая задача и выполняется.
- Этот цикл повторяется, пока обе очереди не станут пустыми и больше не будет асинхронных операций в ожидании.
Пример использования Future и scheduleMicrotask:
dart
Во Flutter Event Loop управляет выполнением задач UI (перерисовка виджетов), обработкой жестов, сетевыми запросами и другими асинхронными операциями, обеспечивая плавную работу приложения без блокировки UI. Важные задачи Flutter (например, планирование кадра для рендеринга) часто используют Microtask Queue для достижения более высокой приоритетности.