Ответ вслух Middle Dart: Future, Stream, изоляты спрашивают часто обновлено

Event loop в Dart и Flutter

Вопрос

Расскажите, как устроена асинхронность в Dart: event loop, Future, изоляты. Как это связано с плавностью интерфейса Flutter?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Dart-код работает в изоляте: у него один поток и своя память. Внутри event loop с двумя очередями.

Что должно прозвучать в ответе

  • Один поток на изолят, event loop с microtask и event queue

  • Порядок: синхронный код, все микрозадачи, одно событие, снова микрозадачи

  • `async` выполняется синхронно до первого `await`, продолжения через микрозадачи

  • Кадры Flutter тоже события: долгий синхронный код или цепочка микрозадач дают фризы

  • Тяжёлые вычисления в изолят: `compute`, `Isolate.run`; ожидание ввода-вывода выносить не нужно

  • Изоляты не делят память, обмен сообщениями

Что могут спросить следом

  • Что выведет код с scheduleMicrotask, Future и then?
  • Почему compute не ускоряет HTTP-запрос?
  • Как изолят передаёт большие данные?

Разбор

Образцовый ответ: «Dart-код работает в изоляте: у него один поток и своя память. Внутри event loop с двумя очередями. Микрозадачи: продолжения после await, колбэки then у готовых Future, scheduleMicrotask. События: таймеры, ввод-вывод, сообщения и кадры. Цикл выполняет синхронный код, потом все микрозадачи, потом одно событие и опять все микрозадачи. async-функция идёт синхронно до первого await, а дальше продолжается микрозадачей. Для UI это значит: пока работает мой синхронный код, Flutter не может отрисовать кадр. Поэтому сетевые запросы я просто жду, они не занимают поток, а тяжёлые вычисления вроде парсинга большого JSON выношу в Isolate.run или compute. Изоляты не делят память, общаются через порты, поэтому гонок данных нет, но передача данных стоит копирования»

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.