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 luiIsolate.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.