Isolate (Изолят)
Isolate - это самостоятельный процесс, который запускает отдельную DVM со своим heap и EventLoop.
Главный изолят - это изолят, который создаётся вместе с открытием приложения.
Зачем изоляты
Цель создания отдельного изолята - отделить какую-то очень тяжёлую операцию от главного изолята, чтобы не занимать его EventLoop, память и ядра процессора.
Создание изолята
У нас есть возможность создать как постоянный изолят, так и временный, который будет выполнять одну задачу.
Постоянный изолят
Такие изоляты нужны для каких-то фоновых операций, например шифрование данных или обработка файлов.
dart
// main.dart
void main() async {
final isolate = await Isolate.spawn(worker, 'started');
}
//Входная точка изолята
void worker(String str) {
print(str);
}
Как мы видим у нас 2 параметра у Isolate.spawn
.
- Это функция, которая является входной точкой для изолята и она принимает параметр того типа, которого является первое сообщение
- Первое сообщение, которое будет отправлено вместе с созданием изолята
Упрощённые версии
Иногда нам нужно просто запустить какую-то задачу в отдельном ядре и для этого есть Isolate.run
.
dart
Future<void> someFunc() async {
final sum = await Isolate.run(() => heavyCalc(list));
print(sum);
}
Future<int> heavyCalc(List<int> numbers) async {
var sum = 0;
for (final number in numbers) {
await Future.delayed(const Duration(seconds: 1));
sum += number;
}
return sum;
}
Как общаться изолятам
Тут будет про порты