Что относится к макрозадачам (macrotask) в Dart?

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

Ответ

В Dart макрозадачи (macrotasks) — это задачи, которые планируются в очередь событий (event queue) и выполняются в следующих итерациях Event Loop. Они имеют более низкий приоритет, чем микрозадачи (microtasks).

Типичные примеры макрозадач:

  • Обработка внешних событий: Пользовательский ввод (тапы, жесты), таймеры (Timer.run, Future.delayed), сообщения от операционной системы.
  • I/O-операции: Завершение сетевого запроса, чтение/запись файла.
  • Завершение Future: Коллбэк, переданный в Future(() => ...) или then() (если Future еще не завершен), выполняется как макрозадача.

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

  1. Выполняется синхронный код до конца.
  2. Обрабатывается вся очередь микрозадач (microtask queue) до опустошения.
  3. Берется и выполняется одна задача из очереди событий (event queue).
  4. Возврат к шагу 2 (проверка микрозадач).

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

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

  // Помещается в очередь событий (макрозадача)
  Future(() => print('4. Future (macrotask from event queue)'));

  // Помещается в очередь микрозадач
  scheduleMicrotask(() => print('3. Microtask'));

  // Синхронный код продолжает выполняться
  print('2. End (синхронный код)');

  // Event Loop начнет работу после завершения main()
}

Вывод:

1. Start (синхронный код)
2. End (синхронный код)
3. Microtask
4. Future (macrotask from event queue)