Каким образом можно реализовать параллельное выполнение двух потоков в языке 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.