Sobes.tech
Middle

რატომ არ შეიძლება გრძელვადიანი გამოთვლითი ოპერაციების განხორციელება ასინქრონულ მეთოდში?

sobes.tech AI

პასუხი AI-სგან

გრძელვადიანი გამოთვლითი ოპერაციები ასინქრონული მეთოდში, რომელიც შესრულებულია ძირითად იზოლატში (UI თემა), ბლოკავს UI-ს. მიუხედავად იმისა, რომ ასინქრონული მეთოდი იყენებს Future ან async/await, ის მაინც შესრულდება იმავე ნაკადში. როდესაც რესურსმომჭირნე დავალება მიმდინარეობს, UI ვერ განახლდება, რაც იწვევს აპლიკაციის "ყინვას".

გრძელვადიანი ოპერაციების განსახორციელებლად UI-ს ბლოკვის გარეშე უნდა გამოიყენოთ:

  • იზოლატები: ცალკე შესრულების ნაკადები, რომლებიც არ იყოფიან მეხსიერებას ძირითადი იზოლატთან. ურთიერთობა იზოლატებს შორის ხდება პორტების (SendPort, ReceivePort) მეშვეობით.
  • Compute ფუნქცია: მოსახერხებელი ორბიტა მცირე გამოთვლებისთვის იზოლატების შექმნისა და მართვისთვის.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// ფუნქცია, რომელიც ასრულებს გრძელვადიან გამოთვლებს
int performHeavyComputation(int data) {
  // გრძელვადიანი გამოთვლების იმიტაცია
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// გამოყენება compute-ის, რათა შესრულდეს სხვა იზოლატში
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// მაგალითი StatefulWidget-ში
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // გრძელვადიანი გამოთვლების სხვა იზოლატში
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // UI განახლება შედეგის მიღების შემდეგ
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('გამოთვლების შედეგი: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('დაწყება გამოთვლებს'),
          ),
        ],
      ),
    );
  }
}