Ответ
В 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() или метод стейт-менеджера.