Flutter: async или isolate. Параллелизм

Многие не понимают разницу между async и isolate (параллелизмом и конкурентностью). В этой статье мы разберём эти понятия, а в следующей покажу, как реализовать изоляты в Dart.

ASYNC
Сначала разберём async, так как большинство из нас уже использовало этот подход хотя бы раз.

void readData() async {
  var url = "www.example.com";
  var content = await http.get(url); // Асинхронный вызов
  var data = parsingData(content); // Здесь будем использовать изолят, так как операция тяжелая
}

Этот код выполняется в обычном режиме до вызова загрузки файла, после чего программа ждёт, пока файл будет загружен. Пока она ждёт, другие части программы могут продолжать работать. Однако, обратите внимание, что в любой момент времени работает только одна часть приложения — ведь у нас всего один поток, один процессор. Асинхронность не делает ваше приложение многопоточным автоматически. После загрузки файла метод продолжит выполнение. Это и есть async. Когда задача (future) завершается, выполнение продолжается с следующей строки кода. В большинстве случаев async достаточно.

В примере выше наш код будет ждать на второй строке (await http.get(url)) до тех пор, пока данные не будут получены с интернета, и после этого мы начнем их обработку.

Теперь представьте, что файл очень большой, и его обработка требует много ресурсов процессора. Это может вызвать задержки в работе приложения? Многие могут подумать, что нет, так как вычисления происходят в асинхронном методе. Но это не так. Почему? Даже если метод асинхронный, в нём всё равно может происходить много синхронных операций. Эта обработка данных (parsingData) выполняется синхронно. Она занимает процессор, и другие части вашего приложения не смогут выполняться. Интерфейс пользователя не обновится, пока тяжелая работа не будет завершена, и пользователь увидит задержки и «подтормаживания».

Решение? Многопоточность с помощью изолятов!

ИЗОЛЯТЫ
Dart позволяет выполнять код параллельно с помощью изолятов. Изолят запускает другой процесс Dart, фактически, на другом потоке, на другом процессоре. Эти два изолята полностью изолированы друг от друга. Один не блокирует другой. Таким образом, ваше приложение может выполнять тяжелые вычисления и одновременно оставаться отзывчивым для пользователя. В этой статье я не буду углубляться в реализацию изолятов, так как это немного сложнее, и цель статьи — разъяснить разницу между async и изолятами.

Изолят можно представить как отдельное пространство на машине со своим собственным участком памяти и одним потоком, выполняющим события. В отличие от языков, таких как C++, где несколько потоков могут разделять одну память и выполнять произвольный код, в Dart каждый поток работает в своем собственном изоляте, с собственной памятью и обрабатывает только события.

Когда использовать изоляты?

Большинство приложений Dart работают в одном изоляте, но можно использовать больше, если это необходимо. Например, если вам нужно выполнить вычисление, которое может занять слишком много времени в основном изоляте и привести к «подтормаживанию», вы можете использовать Isolate.spawn() или функцию compute в Flutter, чтобы создать отдельный изолят для выполнения тяжелых вычислений, оставляя основной изолят свободным для перерисовки интерфейса.

Этот новый изолят получит свой собственный цикл событий и свою память, к которой родительский изолят не имеет доступа. Изоляты называются так потому, что они изолированы друг от друга. Они могут взаимодействовать только посредством передачи сообщений. Один изолят отправляет сообщение другому, и тот обрабатывает его в своем цикле событий.

Подведем итоги:
Async позволяет ждать выполнения других операций без блокировки текущего потока. Async не создаёт отдельный поток; Dart просто переключается между разными частями программы по мере необходимости. Но если необходимо выполнение параллельных задач, вам нужны изоляты. Они сложнее в настройке, но позволяют решать задачи, требующие интенсивных вычислений, без задержек в работе пользовательского интерфейса.

Изоляты играют важную роль в обеспечении конкурентной обработки. Выполнение ресурсоемких операций в основном потоке может негативно сказаться на производительности приложения. Использование изолятов позволяет значительно повысить производительность и эффективность приложений Flutter.

Источник: https://medium.com/@AryanBeast/async-vs-isolate-in-flutter-parallelism-in-flutter-ae3954fb5d4c