Что такое многопоточность в Dart?

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

Ответ

В Dart многопоточность реализована через изоляты (isolates), а не через традиционные потоки, разделяющие память. Каждый изолят имеет свою собственную область памяти и цикл событий (event loop). Изоляты выполняются параллельно и общаются друг с другом только через передачу сообщений, что исключает состояние гонки (race conditions) и необходимость в блокировках (locks).

Основные концепции:

  • Главный изолят (Main Isolate): Запускается с main(), отвечает за UI. Должен оставаться отзывчивым, поэтому тяжелые вычисления нужно выносить в фоновые изоляты.
  • Создание фонового изолята: Используется функция Isolate.spawn() или удобная обёртка compute().

Пример с compute для тяжёлых вычислений:

import 'package:flutter/foundation.dart';

void main() async {
  // compute запускает функцию в новом изоляте и возвращает Future с результатом
  final result = await compute(_calculateComplexData, 1000000);
  print('Результат: $result');
}

// Функция ДОЛЖНА быть топ-уровневой или статической
int _calculateComplexData(int iterations) {
  int sum = 0;
  for (int i = 0; i < iterations; i++) {
    sum += i;
  }
  return sum;
}

Асинхронность (async/await, Future, Stream) НЕ является многопоточностью. Это неблокирующие операции, выполняемые в рамках одного изолята. Они идеальны для I/O-задач (сеть, файлы), но не для CPU-интенсивных операций, которые блокируют цикл событий.

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

  • Обработка больших изображений/данных.
  • Сложные математические вычисления.
  • Парсинг больших JSON или других структур.

Когда достаточно async/await:

  • Сетевые запросы (HTTP, GraphQL).
  • Работа с локальной БД (например, через sqflite).
  • Чтение/запись файлов.

Видео-ответы