Sobes.tech
Middle

Flutter bağlamında Dart'ta iki iş parçacığı nasıl oluşturulur?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dart/Flutter'da bağımsız yürütme akışları oluşturmak için İzolatlar (Isolates) kullanılır. Bunlar, kendi tahsis edilmiş bellek alanına sahip ayrı görevlerdir ve bu, veriye eşzamanlı erişim sorunlarını ve ana akışın (UI akışı) kilitlenmesini önler.

İzolatlarla etkileşim kurmanın birkaç yolu vardır:

  1. Isolate.spawn(): İzolat oluşturmanın en düşük seviyeli yoludur. Bu, yeni izolatta çalıştırılacak üst düzey bir fonksiyon veya statik bir sınıf yöntemi ile mesaj alışverişi için bir port iletmenizi gerektirir.

    import 'dart:isolate';
    
    // İzolat içinde çalıştırılan fonksiyon
    void isolateEntry(SendPort sendPort) {
      int result = 0;
      for (int i = 0; i < 1000000000; i++) {
        result += i;
      }
      sendPort.send(result);
    }
    
    void main() async {
      ReceivePort receivePort = ReceivePort();
      Isolate isolate = await Isolate.spawn(isolateEntry, receivePort.sendPort);
      receivePort.listen((message) {
        print('İzolat sonucu: $message');
        isolate.kill();
      });
      print('Ana akış devam ediyor...');
    }
    
  2. compute(): flutter/foundation paketinden basitleştirilmiş bir fonksiyon olup, Isolate.spawn() kullanır. Basit arka plan görevleri için idealdir.

    import 'package:flutter/foundation.dart';
    
    int heavyComputation(int limit) {
      int result = 0;
      for (int i = 0; i < limit; i++) {
        result += i;
      }
      return result;
    }
    
    void main() async {
      int result = await compute(heavyComputation, 1000000000);
      print('Hesaplama sonucu: $result');
    }
    
  3. Isolate.spawnUri(): Bir ayrı dosyadan kodu yeni bir izolat içinde çalıştırmak için kullanılır.

İzolatlar Arası Etkileşim:

İzolatlar, yalnızca SendPort ve ReceivePort örnekleri aracılığıyla mesaj ileterek veri alışverişi yapar. Bu işlemler atomiktir.

  • SendPort: Bir izolat'tan diğerine mesaj göndermek için kullanılır.
  • ReceivePort: Gelen mesajları dinlemek için kullanılır.

İzolatlar arasında nesne aktarımı sırasında, bu nesnelerin "transfer edilebilir" olması gerekir, bu da şunları içerir:

  • Basit veri tipleri (int, double, String, bool)
  • Transfer edilebilir tipleri içeren listeler ve haritalar
  • Serileştirilebilir Flutter tipleri

Transfer edilemeyen nesneler kopyalanır ve bir izolat'taki sonraki değişiklikler diğerine yansımayacaktır.

Anahtar Noktalar:

  • İzolatlar birbirlerinin belleğine doğrudan erişemez.
  • Paylaşılan duruma, değişkenlere, sınıflara ve ana izolatın (UI akışı) widget'larına erişimleri yoktur.
  • İzolatlar arasındaki iletişim asenkroniktir.
  • Flutter'da izolatlarla çalışırken, yaşam döngülerini doğru yönetmek önemlidir (örneğin, gerekirse isolate.kill() kullanmak).

İzolatların kullanımı, uzun süren veya kaynak yoğun işlemleri arka planda gerçekleştirmenize olanak tanır, böylece kullanıcı arayüzü donmaz ve uygulamanın akıcı çalışması sağlanır.