Isar Plus
Tarifler

Çoklu İzole Kullanımı

Daha yüksek performans için Isar'ı birden fazla Dart izolesinde kullanmayı öğrenin

Çoklu İzole Kullanımı

Dart kodu thread yerine izoleler içinde çalışır. Her izolenin kendi bellek yığını vardır ve bir izoladaki durum diğer izoleler tarafından erişilemez.

Isar aynı anda birden fazla izoleden erişilebilir ve watcher'lar bile izoleler arasında çalışır. Bu tarifte Isar'ı çoklu izole ortamında nasıl kullanacağımızı inceleyeceğiz.

Ne zaman birden fazla izole kullanılmalı?

Isar işlemleri aynı izolada çalışsalar bile paralel yürütülür. Yine de bazı durumlarda Isar'a birden fazla izoleden erişmek faydalıdır.

Bunun nedeni, Isar'ın verileri Dart nesnelerine dönüştürürken ve geri yazarken hatırı sayılır zaman harcamasıdır. Bunu JSON kodlama/çözme işlemlerine benzetebilirsiniz (sadece daha verimli). Bu işlemler veriye eriştiğiniz izolada çalışır ve doğal olarak izoladaki diğer kodları engeller. Başka bir deyişle: Isar işin bir kısmını Dart izolenizde gerçekleştirir.

İzole Ne Zaman Kullanılır?

Aynı anda sadece birkaç yüz nesne okuyup yazmanız gerekiyorsa bunu UI izolesinde yapmak sorun olmaz. Ancak çok büyük işlemler için veya UI thread'i zaten meşgulse ayrı bir izole kullanmayı düşünmelisiniz.

Örnek

Yapmamız gereken ilk şey, yeni izolada Isar'ı açmak. Isar örneği ana izolada zaten açık olduğundan Isar.open() aynı örneği döndürür.

Şema Tutarlılığı

Ana izoladakiyle aynı şemaları sağladığınızdan emin olun. Aksi takdirde hata alırsınız.

compute() Flutter'da yeni bir izole başlatır ve verilen fonksiyonu bu izolada çalıştırır.

main.dart
void main() async {
  // UI izolesinde Isar'ı aç
  final dir = await getApplicationDocumentsDirectory();
  
  final isar = Isar.open(
    schemas: [MessageSchema],
    directory: dir.path,
    name: 'myInstance',
  );

  // veritabanındaki değişiklikleri dinle
  isar.messages.watchLazy(() {
    print('Aaa mesajlar değişti!');
  });

  // yeni bir izole başlat ve 10000 mesaj oluştur
  compute(createDummyMessages, 10000).then(() {
    print('izole bitti');
  });

  // bir süre sonra:
  // > Aaa mesajlar değişti!
  // > izole bitti
}

// yeni izolada çalıştırılacak fonksiyon
Future createDummyMessages(int count) async {
  // örnek zaten açık olduğu için path'e ihtiyacımız yok
  final dir = await getApplicationDocumentsDirectory();
  
  final isar = Isar.open(
    schemas: [PostSchema],
    directory: dir.path,
    name: 'myInstance',
  );

  final messages = List.generate(count, (i) => Message()..content = 'Message $i');
  
  // izolelerde senkron işlemler kullanıyoruz
  isar.write((isar) {
    isar.messages.putAll(messages);
  });
}

Dikkat edilmesi gereken noktalar

İzoleler Arası Watcher'lar

isar.messages.watchLazy() UI izolesinde çağrılır ve başka bir izoladan gelen değişiklikleri bildirir.

İsimlendirilmiş Örnekler

Örnekler isimleriyle referans alınır. Varsayılan isim defaulttur ancak bu örnekte myInstance kullandık.

Senkron İşlemler

Mesajları oluşturmak için senkron işlem kullandık. Yeni izolemizi bloklamak sorun değil ve senkron işlemler biraz daha hızlıdır.

Performans İpucu

Senkron işlemler (write()) asenkron işlemlerden (writeAsync()) daha hızlıdır ve bloklamanın sorun olmadığı arka plan izoleleri için idealdir.

Son Güncelleme