Sobes.tech
Middle

Ποια είναι η γνώση σας σχετικά με την ασυγχρονία στο Dart;

sobes.tech AI

Απάντηση από AI

Η ασυγχρονία στο Dart υλοποιείται με:

  • Η έννοια των "απομονωτών" (Isolates): Ανεξάρτητα εργασιακά διαδικασίες, η καθεμία με τη δική της μνήμη. Χρησιμοποιούνται για την παράλληλη εκτέλεση εργασιών που απαιτούν πόρους, χωρίς να μπλοκάρουν το κύριο νήμα της διεπαφής χρήστη. Η επικοινωνία μεταξύ απομονωτών γίνεται μέσω θυρών (ReceivePort, SendPort).

  • Λέξεις-κλειδιά async, await:

    • async σηματοδοτεί μια λειτουργία που θα εκτελεί ασύγχρονες λειτουργίες και θα επιστρέφει ένα Future.
    • await χρησιμοποιείται μέσα σε μια async λειτουργία για να περιμένει την ολοκλήρωση ενός Future. Όταν φτάσει, η εκτέλεση της λειτουργίας διακόπτεται, επιτρέποντας σε άλλες λειτουργίες να εκτελεστούν, ενώ το Future ολοκληρώνεται με μια τιμή ή σφάλμα.
    Future<String> fetchData() async {
      // Προσομοίωση καθυστέρησης
      await Future.delayed(Duration(seconds: 2));
      return 'Δεδομένα λήφθηκαν';
    }
    
    void main() async {
      print('Αρχή');
      String result = await fetchData(); // Περιμένουμε την ολοκλήρωση του fetchData
      print(result);
      print('Τέλος');
    }
    
  • Η κλάση Future<T>: Αντιπροσωπεύει το αποτέλεσμα μιας ασύγχρονης λειτουργίας που θα είναι διαθέσιμο στο μέλλον. Το Future μπορεί να βρίσκεται σε μία από τρεις καταστάσεις:

    • Μη ολοκληρωμένο (uncompleted)
    • Ολοκληρωμένο με μια τιμή (completed with a value)
    • Ολοκληρωμένο με σφάλμα (completed with an error)

    Η διαχείριση της ολοκλήρωσης του Future γίνεται με then(), catchError(), whenComplete() ή await.

  • Η κλάση Stream<T>: Αντιπροσωπεύει μια ακολουθία ασύγχρονων γεγονότων. Χρησιμοποιείται για την επεξεργασία ροών δεδομένων, π.χ., ανάγνωση από αρχείο, λήψη δεδομένων μέσω δικτύου, γεγονότα διεπαφής χρήστη. Η ροή μπορεί να είναι με μία μόνο εγγραφή (single-subscription) ή πολλαπλές εγγραφές (broadcast). Η επεξεργασία γεγονότων της ροής γίνεται με listen(), async*, yield.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Αποστολή τιμής στη ροή
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Λήφθηκε: $data'),
        onError: (error) => print('Σφάλμα: $error'),
        onDone: () => print('Η ροή ολοκληρώθηκε'),
      );
    }
    

Η ασυγχρονία στο Dart βασίζεται στο μοντέλο "βρόχο γεγονότων" (event loop). Το κύριο νήμα εκτελεί τον κώδικα με σειριακή σειρά, αλλά όταν συναντά μια ασύγχρονη λειτουργία (π.χ., await ή Future.then), την αναθέτει στη "στοίβα γεγονότων" (event queue) και συνεχίζει την εκτέλεση του επόμενου κώδικα. Όταν η ασύγχρονη λειτουργία ολοκληρωθεί, το αποτέλεσμα της επιστρέφεται πίσω στη "στοίβα γεγονότων". Ο βρόχος γεγονότων ελέγχει συνεχώς τη "στοίβα γεγονότων" και εκτελεί εργασίες όταν το κύριο νήμα είναι ελεύθερο.