Какие инструменты Dart используются для работы с многопоточностью и параллельными вычислениями?

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

Ответ

В Dart модель параллелизма построена на изолятах (Isolates), которые не разделяют память. Для работы с ними и асинхронными операциями используются следующие инструменты:

  • Isolates (Базовый API): Легковесные потоки с собственной кучей памяти. Общение между ними происходит через передачу сообщений.

    void main() async {
      final receivePort = ReceivePort();
      await Isolate.spawn(heavyComputation, receivePort.sendPort);
      receivePort.listen((message) {
        print('Результат из изолята: $message');
        receivePort.close();
      });
    }
    void heavyComputation(SendPort sendPort) {
      final result = _calculate(); // CPU-intensive task
      sendPort.send(result);
    }
  • compute() функция (Flutter): Упрощенный высокоуровневый API для запуска функции в отдельном изоляте и получения результата. Идеально подходит для разовых тяжелых вычислений.

    import 'package:flutter/foundation.dart';
    int fibonacci(int n) { /* ... */ }
    void main() async {
      final result = await compute(fibonacci, 40);
      print(result);
    }
  • Isolate.run() (Dart 2.19+): Современная замена compute(), доступная в чистом Dart. Более удобный API.

    void main() async {
      final result = await Isolate.run(() => _expensiveTask());
      print(result);
    }
  • Асинхронность (async/await, Future, Stream): Хотя это не истинный параллелизм, эти инструменты позволяют эффективно работать с I/O-операциями (сеть, файлы) без блокировки основного потока, что критически важно для отзывчивого UI во Flutter.

Важно: Для обновления UI после работы в изоляте необходимо передать результат в главный изолят (который управляет Flutter) и использовать setState() или метод стейт-менеджера.