В мире разработки приложений производительность является ключевым фактором. Пользователи ожидают плавных и отзывчивых приложений, которые могут эффективно решать сложные задачи. Чтобы достичь этого, разработчики часто обращаются к таким методам, как параллельная обработка, чтобы оптимизировать свои приложения. Во Flutter, популярном наборе инструментов пользовательского интерфейса для создания кроссплатформенных приложений, два широко используемых подхода к параллельной обработке — это «Изолировать» и «Вычислить». В этой статье мы рассмотрим различия между Flutter Isolate и Compute и когда использовать каждый из них.

Изоляция флаттера:

Flutter Isolate — это функция, которая позволяет разработчикам запускать код Dart в отдельном изолированном потоке выполнения. Этот отдельный изолят работает в своем собственном пространстве памяти, независимо от основного изолята, в котором работает пользовательский интерфейс. Flutter Isolate может выполнять вычисления параллельно пользовательскому интерфейсу, не блокируя основной поток и не влияя на скорость отклика приложения.
Flutter Isolate идеально подходит для выполнения ресурсоемких задач, таких как сложные вычисления, обработка изображений или анализ данных. Перенося эти задачи на отдельные изоляты, разработчики могут гарантировать, что основной поток пользовательского интерфейса останется отзывчивым, обеспечивая плавный пользовательский интерфейс. Flutter Isolate также поддерживает двустороннюю связь с основным изолятом, что позволяет передавать данные между изолятами.
Одной из ключевых особенностей Flutter Isolate является его способность обрабатывать несколько изолятов. Это означает, что разработчики могут одновременно создавать несколько изолятов и управлять ими, каждый из которых выполняет свою задачу или вычисление. Это делает изоляцию Flutter высоко масштабируемой и подходящей для приложений, требующих параллельной обработки нескольких задач одновременно.

import 'dart:isolate';

void main() async {
  // Spawn a new isolate
  Isolate isolate = await Isolate.spawn(runIsolate, 'Hello from isolate!');

  // Send a message to the isolate
  isolate.sendPort.send('Message from main isolate!');

  // Receive a message from the isolate
  ReceivePort receivePort = ReceivePort();
  isolate.addOnExitListener(receivePort.sendPort);
  receivePort.listen((dynamic message) {
    print('Received message in main isolate: $message');
  });
}

void runIsolate(dynamic message) {
  print('Isolate started with message: $message');

  // Send a message to the main isolate
  SendPort sendPort = IsolateNameServer.lookupPortByName('main');
  sendPort.send('Message from isolate!');

  // Receive a message from the main isolate
  ReceivePort receivePort = ReceivePort();
  sendPort.send(receivePort.sendPort);
  receivePort.listen((dynamic message) {
    print('Received message in isolate: $message');
  });
}

Вычислить:

С другой стороны, Compute — это вспомогательная функция, предоставляемая Flutter, которая упрощает запуск функции в отдельном изоляте. Это сокращенный способ создания изолятов и управления ими без создания и управления ими вручную с помощью класса Isolate. Compute принимает функцию в качестве аргумента и автоматически создает изолят для запуска этой функции параллельно с пользовательским интерфейсом.
Функция Compute лучше всего подходит для краткосрочных задач, которые не требуют больших вычислительных ресурсов и не требуют обширного взаимодействия с основной изолят. Примеры функций, которые можно выгрузить в вычислительные ресурсы, включают сортировку списка, преобразование форматов данных или выполнение простых операций с данными. Compute прост в использовании и обеспечивает простой способ распараллеливания задач без необходимости вручную управлять изолятами, что делает его идеальным для задач малого и среднего размера.

import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:image/image.dart' as img;

void main() async {
  File imageFile = File('image.jpg');

  // Load and process the image in a separate isolate
  img.Image processedImage = await compute(_processImage, imageFile);

  // Save the processed image to a new file
  File processedImageFile = File('processed_image.jpg');
  await processedImageFile.writeAsBytes(img.encodeJpg(processedImage));
  print('Processed image saved to: ${processedImageFile.path}');
}

img.Image _processImage(File imageFile) {
  // This is the computationally intensive task
  img.Image image = img.decodeImage(imageFile.readAsBytesSync());
  img.Image processedImage = // Perform image processing operations
  return processedImage;
}

Отличия:

Основное различие между Flutter Isolate и Compute заключается в уровне контроля и сложности, которые они предлагают. Flutter Isolate обеспечивает более детальный контроль над созданием изолятов и управлением ими, что делает его подходящим для сложных задач, которые требуют обширного взаимодействия с основным изолятом или предполагают совместную работу нескольких изолятов. С другой стороны, вычислительные ресурсы предоставляют более простой способ выгрузки краткосрочных задач в отдельный изолят без необходимости вручную управлять изолятами.
Еще одним ключевым отличием является уровень масштабируемости. Изолировать Flutter позволяет создавать несколько изолятов и управлять ими, что делает его легко масштабируемым для приложений, требующих параллельной обработки нескольких задач. В отличие от этого, вычислительная среда предназначена для задач малого и среднего размера и обеспечивает другой уровень масштабируемости.

Когда использовать каждый из них:

Изоляция Flutter обычно рекомендуется для задач с интенсивными вычислениями или задач, требующих обширного взаимодействия с основным изолятом, и когда масштабируемость является проблемой. Используйте Flutter Isolate, когда вам нужен детальный контроль над изолятами, а также когда вам нужно одновременно создавать несколько изолятов и управлять ими.
не требуют обширной связи с основным изолятом. Используйте вычислительные ресурсы, если вам нужен простой и удобный способ выгрузки краткосрочных задач в отдельный изолят без необходимости вручную управлять изолятами.

В заключение, Flutter Isolate и Compute являются мощными инструментами для параллельной обработки в приложениях Flutter.