Skip to content

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.

  1. Это функция, которая является входной точкой для изолята и она принимает параметр того типа, которого является первое сообщение
  2. Первое сообщение, которое будет отправлено вместе с созданием изолята

Упрощённые версии

Иногда нам нужно просто запустить какую-то задачу в отдельном ядре и для этого есть 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;
}

Как общаться изолятам

Тут будет про порты