CodeBlanks Logo Icon CodeBlanks

Concurrency

Isolate ile paralel işleme eklersin.

Isolate ile paralel hesap

Isolate, Dart'ın paralel çalışma birimidir. Dart tek iş parçacıklıdır (single-threaded); ağır hesap ana iş parçacığını bloklar. Isolate.run bir işlevi ayrı bir isolate'de çalıştırır ve sonuçu Future olarak döndürür.

Örnek: Future<int> heavyCompute(int n) { return Isolate.run(() => fib(n)); }. Burada fib(n) ayrı isolate'de hesaplanır; ana iş parçacığı serbest kalır. Isolate'ler bellek paylaşmaz; her biri kendi yığınına sahiptir. Bu nedenle veri kopyalanarak aktarılır. Ağır CPU işleri (büyük hesap, görüntü işleme) isolate'e taşınır; böylece arayüz akıcı kalır.

heavyCompute deseni

heavyCompute, ağır fibonacci hesabını isolate'de çalıştıran fonksiyondur. fib öz-günlü (naive) yazımda yavaştır; büyük n için ana iş parçacığını döndürür. Isolate.run ile bu yük arka plana taşınır.

Örnek: int fib(int n) { if (n < 2) return n; return fib(n-1) + fib(n-2); } ve Future<int> heavyCompute(int n) { return Isolate.run(() => fib(n)); }. fib(10) = 55 deterministiktir. heavyCompute bir Future döndürür; await ile beklenir. Bu desen, arayüzü akıcı tutarken arka planda hesap yapmanın standart yoludur.

Uygulama fib ve heavyCompute

import 'dart:isolate'; satırını en üste ekle. int fib(int n) fonksiyonunu yaz: n < 2 ise n döndür, değilse fib(n-1) + fib(n-2) döndür. Future<int> heavyCompute(int n) fonksiyonu yaz; içinde return Isolate.run(() => fib(n)); yap. main içine print('Isolate: heavyCompute hazır') ve print('fib(10): ${fib(10)}') ekle.

Başlangıç kodu

main.dart
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:sqflite/sqflite.dart';

class Task {
  final int id;
  final String title;
  Task({required this.id, required this.title});
}

abstract class TaskService {
  List<Task> list();
}

class InMemoryTaskService implements TaskService {
  @override
  List<Task> list() => [Task(id: 1, title: 'görev 1')];
}

Response taskHandler(Request req, TaskService svc) {
  return Response.ok('görevler: ${svc.list().length}');
}

class SqliteTaskService {
  final Database db;
  SqliteTaskService(this.db);

  Future<List<Task>> all() async {
    final rows = await db.query('tasks');
    return rows.map((r) => Task(id: r['id'] as int, title: r['title'] as String)).toList();
  }
}

// dart:isolate kütüphanesini içe aktar
// fib ve heavyCompute fonksiyonlarını yaz (Isolate.run ile)

void main() {
  // Isolate bilgisini ve fib(10) yazdır
}

Örnek çözüm

main.dart
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:isolate';

class Task {
  final int id;
  final String title;
  Task({required this.id, required this.title});
}

abstract class TaskService {
  List<Task> list();
}

class InMemoryTaskService implements TaskService {
  @override
  List<Task> list() => [Task(id: 1, title: 'görev 1')];
}

Response taskHandler(Request req, TaskService svc) {
  return Response.ok('görevler: ${svc.list().length}');
}

class SqliteTaskService {
  final Database db;
  SqliteTaskService(this.db);

  Future<List<Task>> all() async {
    final rows = await db.query('tasks');
    return rows.map((r) => Task(id: r['id'] as int, title: r['title'] as String)).toList();
  }
}

int fib(int n) {
  if (n < 2) return n;
  return fib(n - 1) + fib(n - 2);
}

Future<int> heavyCompute(int n) {
  return Isolate.run(() => fib(n));
}

void main() {
  print('Isolate: heavyCompute hazır');
  print('fib(10): ${fib(10)}');
}

Beklenen çıktı

Isolate: heavyCompute hazır
fib(10): 55

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Isolate.run ne sağlar?

  • Şifreleme
  • Paralel hesaplama Doğru cevap
  • Sıkıştırma
  • Serileştirme

Açıklama: Isolate.run paralel hesaplama sağlar.

2 Isolate parçalarını eşleştir

Kavram Anlamı
Isolate İşçi
run Başlatır
fib Fibonacci
heavyCompute Ağır hesap

3 Isolate.run çağrısı

Soru
return Isolate.____(() => fib(n));
Cevap
return Isolate.run(() => fib(n));

Açıklama: Isolate.run(() => fib(n)) hesabı isolate'de çalıştırır.

İleri seviye bölümündeki tüm dersler