Isolate în Dart

Un fir de execuție separat, cu memoria lui; Isolate.current este izolatul în care rulează codul acum.

Sintaxă
import 'dart:isolate';

final class Isolate
static Isolate get current
String? get debugName

Ce face Isolate

Codul Dart rulează în izolate (isolates). Fiecare are propria memorie și propria buclă de evenimente; izolatele nu împart variabile, ci comunică doar prin mesaje (SendPort și ReceivePort). Astfel nu ai nevoie de blocări (lock-uri), iar calculele grele pot rula în paralel pe alte nuclee.

Programul pornește în izolatul principal, numit main. Isolate.current returnează izolatul curent; debugName dă numele lui. Un izolat nou creezi cel mai simplu cu Isolate.run, iar pentru comunicare de durată, cu Isolate.spawn.

Ce returnează

Isolate.current returnează obiectul Isolate curent.

Exemple

Exemplul 1: Numele izolatului curent

import 'dart:isolate';

Future<void> main() async {
  print('Rulez în: ${Isolate.current.debugName}');
  final numeAltIzolat = await Isolate.run(() => Isolate.current.debugName, debugName: 'calcule');
  print('Isolate.run a rulat în: $numeAltIzolat');
}

Rezultat

Rulez în: main
Isolate.run a rulat în: calcule

Exemplul 2: Izolatele nu împart variabile

Izolatul nou primește o copie a variabilei globale; schimbarea făcută acolo nu se vede în main.

import 'dart:isolate';

var contor = 0;

Future<void> main() async {
  final dinIzolat = await Isolate.run(() {
    contor += 100;
    return contor;
  });
  print('În izolatul nou contor = $dinIzolat');
  print('În main contor = $contor');
}

Rezultat

În izolatul nou contor = 100
În main contor = 0

Greșeli frecvente

  • Aștepți ca un izolat să modifice o variabilă din main. Fiecare izolat are memoria lui; rezultatele se trimit înapoi prin mesaje sau ca rezultat al lui Isolate.run.

Comenzi înrudite

  • Isolate.run: Rulează o funcție într-un izolat nou și dă rezultatul ca Future; cel mai simplu mod de a face un calcul greu în paralel.
  • Isolate.spawn: Pornește un izolat de durată, care rulează o funcție cu un mesaj inițial; kill îl oprește.
  • ReceivePort: Cutia poștală a unui izolat: un Stream cu mesajele primite; sendPort este adresa ei, close o închide.
  • SendPort: Adresa unui ReceivePort; send trimite un mesaj (o copie a datelor) către izolatul care deține portul.