Sobes.tech
Назад к вопросам
Junior — Middle
133

Каким образом можно реализовать параллельное выполнение двух потоков в языке Dart?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

В Dart параллельное выполнение обычно достигается через isolates, а не через общие потоки с разделяемой памятью. Для двух независимых задач нужно запускать две изолированные единицы выполнения и обмениваться данными через сообщения. Future и async/await помогают запускать задачи асинхронно, но это не настоящий параллелизм CPU-bound работы.

Определение:

В Dart код выполняется в изолятах — это отдельные области памяти и выполнения. У изолятов нет общей памяти, поэтому они безопаснее для параллельной обработки тяжелых задач. Если нужно реально выполнить две вычислительные операции одновременно, создают два isolate и передают им данные через SendPort и ReceivePort.

Пример использования:

Например, есть два тяжелых вычисления: парсинг большого файла и обработка изображения. Их можно вынести в разные isolates, чтобы не блокировать UI в Flutter.

import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();

  await Isolate.spawn(task1, receivePort.sendPort);
  await Isolate.spawn(task2, receivePort.sendPort);

  int results = 0;
  await for (final message in receivePort) {
    print('Ответ: $message');
    results++;

    if (results == 2) {
      receivePort.close();
      break;
    }
  }
}

void task1(SendPort sendPort) {
  final result = heavyCalculation(1);
  sendPort.send(result);
}

void task2(SendPort sendPort) {
  final result = heavyCalculation(2);
  sendPort.send(result);
}

int heavyCalculation(int value) {
  var sum = 0;
  for (var i = 0; i < 100000000; i++) {
    sum += value;
  }
  return sum;
}

Пояснение кода:

Код использует ReceivePort для приема сообщений от двух isolates.
Isolate.spawn(...) запускает каждую задачу отдельно, и каждая из них выполняет тяжелый расчет в своем isolate.
После завершения работы каждый isolate отправляет результат обратно через SendPort.
Главный isolate слушает сообщения, выводит их и закрывает порт после получения двух ответов.

Ключевые моменты:

  • Future и async/await дают асинхронность, но не обязательно параллельное выполнение CPU-bound задач.
  • Для настоящего параллелизма в Dart используются Isolate.
  • У isolates нет общей памяти, взаимодействие идет только через сообщения.
  • В Flutter isolates полезны для тяжелых вычислений, чтобы не блокировать UI.
  • Для простого ввода-вывода часто достаточно Future, а для вычислений — Isolate.