Sobes.tech
Middle

Flutter kontekstində Dartda iki iş parçacığı necə yaradılır?

sobes.tech Süni İntellekt

AI-dan cavab

Dart/Flutter-də müstəqil icra axınları yaratmaq üçün İzolyatlar (Isolates) istifadə olunur. Onlar özəl yaddaş sahəsinə malik olan ayrıca tapşırıqlardır və bu, məlumatlara çoxmərhələli giriş və əsas axının (UI-axını) bloklanmasının qarşısını alır.

İzolatlardan istifadə və onlarla qarşılıqlı əlaqə üçün bir neçə üsul mövcuddur:

  1. Isolate.spawn(): İzolyat yaratmanın ən aşağı səviyyəli üsuludur. Bu, yeni izolyatda yerinə yetiriləcək yuxarı səviyyəli funksiya və ya statik metodun ötürülməsini və mesaj mübadiləsi üçün portun istifadəsini tələb edir.

    import 'dart:isolate';
    
    // İzolyatda yerinə yetirilən funksiya
    void isolateEntry(SendPort sendPort) {
      // Uzunmüddətli əməliyyat yerinə yetiririk
      int result = 0;
      for (int i = 0; i < 1000000000; i++) {
        result += i;
      }
      // Nəticəni əsas izolyata göndəririk
      sendPort.send(result);
    }
    
    void main() async {
      ReceivePort receivePort = ReceivePort();
      // Yeni izolyat yaradırıq
      Isolate isolate = await Isolate.spawn(isolateEntry, receivePort.sendPort);
    
      // İzolyatdan gələn mesajları dinləyirik
      receivePort.listen((message) {
        print('İzoliyadan nəticə: $message');
        // Mesaj alındıqdan sonra izolyatı dayandırırıq
        isolate.kill();
      });
    
      print('Əsas axış işləməyə davam edir...');
    }
    
  2. compute(): flutter/foundation paketindən sadələşdirilmiş funksiya, Isolate.spawn()-ın daxili işlədiyi. Sadə fon tapşırıqları üçün idealdır və izolyatla mürəkkəb qarşılıqlı əlaqə tələb etmir.

    import 'package:flutter/foundation.dart';
    
    // compute ilə yerinə yetirilən funksiya
    int heavyComputation(int limit) {
      int result = 0;
      for (int i = 0; i < limit; i++) {
        result += i;
      }
      return result;
    }
    
    void main() async {
      print('Ağır hesablamalara başlayırıq...');
      // Funksiyanı ayrı izolyatda yerinə yetiririk
      int result = await compute(heavyComputation, 1000000000);
      print('Hesablama nəticəsi: $result');
      print('Əsas axış hesablamalardan sonra davam edir.');
    }
    
  3. Isolate.spawnUri(): dart faylından kodu yeni izolyatda işə salmaq üçün istifadə olunur.

İzolatlardan qarşılıqlı əlaqə:

İzolatlardan məlumat mübadiləsi yalnız mesajların ötürülməsi yolu ilə həyata keçirilir və bu, SendPortReceivePort nümunələri vasitəsilə olur. Bu əməliyyatlar atomikdir və kilidləmə və ya digər sinxronizasiya mexanizmlərini tələb etmir.

  • SendPort: Bir izolyatdan digərinə mesaj göndərmək üçün istifadə olunur.
  • ReceivePort: Gələn mesajları dinləmək üçün istifadə olunur.

İzolatlardan obyektlərin ötürülməsi zamanı, onlar "keçirilə bilən" (transferable) olmalıdır, yəni:

  • Sadə məlumat tipləri (int, double, String, bool)
  • Keçirilə bilən tipləri ehtiva edən siyahılar və xəritələr
  • Flutter-ə xas bəzi tiplər, serializə oluna bilən

Keçirilə bilməyən obyektlər kopyalanacaq və onların bir izolyatda edilən dəyişiklikləri digərinə təsir etməyəcək.

Əsas məqamlar:

  • İzolyatlar bir-birinin yaddaşına birbaşa giriş edə bilməz.
  • İzolyatların ümumi vəziyyətə, o cümlədən əsas izolytdakı dəyişənlərə, siniflərə və widgetlərə çıxışı yoxdur.
  • İzolyatlar arasında əlaqə asinxron şəkildə həyata keçirilir.
  • Flutter-də izolyatlarla işləyərkən onların həyat dövrünü düzgün idarə etmək vacibdir (məsələn, isolate.kill() istifadə etmək).

İzolatlardan istifadə, uzunmüddətli və ya resurs tələb edən əməliyyatları fon rejimində yerinə yetirməyə imkan verir, bu da istifadəçi interfeysinin donmasının qarşısını alır və tətbiqin düzgün işləməsini təmin edir.