Executando verificação de segurança...
4

[DART] Explorando Isolates no Dart: Potencializando a Concorrência e o Desempenho

O que são Isolates?

Os isolates são uma característica poderosa da linguagem Dart, projetada para facilitar a execução de código concorrente e paralelo. Enquanto outras linguagens podem recorrer ao uso de threads para alcançar paralelismo, os isolates no Dart oferecem uma abordagem semelhante aos threads de forma segura e eficiente. Cada isolate é uma unidade de execução independente, com sua própria memória isolada, garantindo assim a segurança e minimizando problemas de concorrência.

Por que usar Isolates?

Ao lidar com operações intensivas, como processamento de dados volumosos ou mesmo acesso a serviços como Geolocalização all time, os isolates podem revolucionar o desempenho e a responsividade do seu aplicativo. Distribuir o trabalho entre vários isolates permite tirar proveito máximo dos recursos de hardware disponíveis, permitir execuções em foreground ou backgroud e também melhorar significativamente a eficiência e a escalabilidade do seu aplicativo.

Como usar Isolates?

Existem diversas maneiras de utilizar isolates no Dart. Uma delas é por meio do método Isolate.run(), que executa uma função em um isolate e retorna seu resultado. Veja um exemplo:

  void _isolateRun() async {
    final loopResult = Isolate.run(_longLoop);
    final loop = await loopResult;
    print(loop);
  }

  
  static int _longLoop() {
    int count = 0;
    for (int i = 0; i < 1000000000; i++) {
      count++;
    }
    return count;
  }

É importante lembrar que os isolates no Dart não compartilham memória, o que significa que você não pode passar referências de objetos diretamente entre eles. Em vez disso, você só pode passar dados simples que possam ser serializados. Uma maneira de lidar com essa limitação é garantindo que as funções que você executa em isolates sejam top-level ou estáticas.

Outra maneira de utilizar isolates é por meio do método Isolate.spawn(), que inicia uma nova isolate e executa uma função nela. Essa maneira é possível não só executar uma função e receber o resultado, como manter uma Isolate ativa e comunicar e receber por meio de streams. Veja só

  final receivePort = ReceivePort();
  Isolate.spawn(_isolateEntry, receivePort.sendPort);
  receivePort.listen((message) {
    print(message);
  });
}

static void _isolateEntry(SendPort sendPort) {
  final loop = _longLoop();
  sendPort.send(loop);
}

static int _longLoop() {
  int count = 0;
  for (int i = 0; i < 1000000000; i++) {
    count++;
  }
  return count;
}

Os isolates são muito bacana para lidar com situações de paralelismo no seu desenvolvimento, embora seja complexo às implementações e lidar com todas as situações é importante dominar esse conhecimento para desenvolver apps de forma mais assertiva.

Embora os isolates não estejam disponíveis no desenvolvimento web com Flutter, existem alternativas que podemos explorar. Uma delas são os Web Workers, uma ferramenta que nos permite lidar com processamento massivo no Flutter Web. Na próxima postagem, abordarei o que são e como implementar os Web Workers no Flutter Web, proporcionando assim uma experiência de desenvolvimento ainda mais completa e eficaz.

0