Event loop в Dart и Flutter
Вопрос
Расскажите, как устроена асинхронность в Dart: event loop, Future, изоляты. Как это связано с плавностью интерфейса Flutter?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Один поток на изолят, 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 ошибок.