Что такое изоляты во Flutter
Что проверяют
Отличаете ли вы асинхронность от параллелизма и понимаете ли, почему интерфейс подвисает. Код на Dart внутри одного изолята однопоточный: async и await не создают потоков, они лишь раскладывают работу по очереди событий. Поэтому ожидание ответа сети интерфейс не морозит, а разбор большого ответа морозит, и лечится это разными средствами.
Как отвечать
Изолят это независимая единица исполнения со своей кучей и своей очередью событий. Общей изменяемой памяти между изолятами нет, поэтому нет ни гонок, ни мьютексов. Обмен идёт сообщениями через порты, и сообщение копируется, а не разделяется.
Правило выбора простое. Задача ждёт внешнего события (запрос, файл, база)? Достаточно async и await. Задача надолго занимает процессор (разбор мегабайтного ответа, обработка изображения, шифрование, сжатие)? Нужен отдельный изолят.
Для разовой работы берут одноразовый запуск: функция уезжает в новый изолят, результат приходит как Future. Во Flutter для этого есть готовый помощник.
final jobs = await compute(parseJobs, body);Длинный двусторонний обмен требует ручного создания изолята и пары портов. Ограничения тоже стоит назвать: из фонового изолята нельзя трогать виджеты, а функция для запуска должна быть верхнего уровня или статической, иначе её просто не передать.
Где спотыкаются
Уносят в изолят сетевой запрос и удивляются, что быстрее не стало. Ожидание сокета процессор не занимает, а старт изолята и копирование данных накладные расходы добавили.
Плодят изолят на каждый элемент списка. Это не дешёвый объект: своя куча, своя очередь, копирование аргумента и результата на входе и выходе. Для мелких задач накладные расходы съедают выигрыш, разумнее отдать одной пачкой или держать пул.
Путают изоляты с потоками и пытаются передать замыкание с захваченным состоянием, ссылку на объект интерфейса или живое соединение. Передаётся только то, что копируется; результат принимают в основном изоляте и уже там обновляют экран.