Какие виды потоков (threads) и механизмы параллелизма ты знаешь в Dart/Flutter?

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

Ответ

Архитектура Dart, на которой построен Flutter, использует однопоточную модель с изолятами (isolates) для параллелизма. Вот основные концепции:

  1. Основной поток (Main Thread / UI Thread)

    • Единственный поток, в котором работает весь код Flutter (Dart), включая построение виджетов, обработку событий и рендеринг UI.
    • Критически важно не блокировать его долгими операциями, иначе интерфейс "зафризится".
  2. Изолят (Isolate)

    • Это не "поток" в классическом понимании, а отдельный контекст выполнения с собственной памятью (heap). Изоляты не разделяют память и общаются только через передачу сообщений (message passing).
    • Идеально подходит для CPU-intensive задач (сортировка больших массивов, сложные вычисления), так как не блокирует UI.
      // Пример использования Isolate.run (Dart 2.15+) для тяжелой задачи
      Future<void> performHeavyCalculation() async {
      final result = await Isolate.run(() {
      // Этот код выполняется в отдельном изоляте
      return expensiveCalculation(); // Допустим, вычисление 1 млн чисел Фибоначчи
      });
      // Результат возвращается в основной изолят
      print('Result: $result');
      }
  3. Event Loop (Цикл событий)

    • Механизм в основном изоляте для обработки асинхронных операций (Future, Stream, таймеры, I/O).
    • Позволяет выполнять неблокирующие операции (например, сетевые запросы) без создания новых изолятов.
      // Event Loop управляет выполнением этого кода
      Future<void> fetchData() async {
      final response = await http.get(Uri.parse('https://api.example.com/data')); // I/O операция не блокирует UI
      setState(() { data = jsonDecode(response.body); });
      }

Итог: Для I/O операций (сеть, файлы) я использую async/await и Event Loop. Для настоящих параллельных вычислений, нагружающих процессор, — изоляты. "Рабочие потоки" (Worker Threads) — это обычно нативные потоки платформы, которые Flutter использует "под капотом" для задач вроде рендеринга Skia или декодирования изображений.