Πώς παρακολουθεί το scope την ακύρωση μιας coroutine;
sobes.tech AI
Απάντηση από AI
Το scope παρακολουθεί την ακύρωση μιας coroutine μέσω του αντικειμένου Job. Κάθε CoroutineScope έχει ένα συσχετισμένο Job.
Όταν δημιουργείται μια νέα coroutine μέσα σε ένα CoroutineScope, λαμβάνει το Job αυτού του scope ως τον γονικό Job της.
Ο μηχανισμός παρακολούθησης ακύρωσης λειτουργεί ως εξής:
- Ακύρωση Scope: Όταν καλείται
cancel()στοJobτου scope, αυτό ακυρώνει αναδρομικά όλα ταJobτων παιδιών του. - Ακύρωση Υιοθετημένης Coroutine: Κατά την ακύρωση μιας υιοθετημένης coroutine (π.χ., μέσω
withContext(NonCancellable)) ή σε περίπτωση μη διαχειριζόμενης εξαίρεσης, αυτή ενημερώνει τοJobτου γονέα της. Ο γονικόςJob(του scope) μπορεί με τη σειρά του να ακυρώσει άλλες υιοθετημένες coroutine. - Συνεργατική Ακύρωση: Οι coroutine πρέπει να είναι συνεργατικές όσον αφορά την ακύρωση. Αυτό σημαίνει ότι μέσα στην coroutine, ο κώδικας πρέπει να ελέγχει περιοδικά αν έχει ακυρωθεί, ώστε να τερματίσει σωστά τη δουλειά του. Οι λειτουργίες suspend (όπως το
delay, λειτουργίες I/O) ελέγχουν αυτόματα την κατάσταση τουJob.
Ο κώδικας μπορεί να ελέγξει ρητά την ακύρωση χρησιμοποιώντας isActive ή ensureActive():
// Παράδειγμα ελέγχου ενεργότητας coroutine
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Εκτέλεση κάποιας μακράς λειτουργίας
delay(100) // σημείο αναστολής - ελέγχει αυτόματα την ακύρωση
// Ή ρητά ελέγχει
if (!isActive) {
break // Έξοδος από το βρόχο σε περίπτωση ακύρωσης
}
}
println("fetchData ολοκληρώθηκε")
}
}
Η χρήση του ensureActive() ρίχνει μια CancellationException σε περίπτωση ακύρωσης:
// Χρήση του ensureActive()
suspend fun processData() {
// ... κάποια εργασία ...
ensureActive() // Θα ρίξει CancellationException αν η coroutine ακυρώθηκε
// ... συνέχιση εργασίας μόνο αν η coroutine είναι ενεργή ...
}
Η CancellationException είναι ο τυπικός τρόπος διάδοσης του σήματος ακύρωσης. Δεν πρέπει να θεωρείται σφάλμα στο πλαίσιο της ακύρωσης των coroutine.
Το scope, έχοντας ένα Job, δημιουργεί μια ιεραρχία "γονέα-παιδιού" Job, που επιτρέπει τη διάδοση του σήματος ακύρωσης από τον γονέα στα παιδιά. Αυτό αποτελεί το θεμέλιο του δομημένου παραλληλισμού στις coroutine.