Ιδιοκτησία πόρων και καθαρισμός σε εξαιρέσεις — DedSec Project
Ιδιοκτησία πόρων και καθαρισμός σε εξαιρέσεις Μηχανισμός και συμβόλαιο Μια συνάρτηση που ανοίγει πόρο χρειάζεται σαφή ιδιοκτήτη κλεισίματος. Η ιδιοκτησία θολώνει όταν helper δέχεται ονόματα…
Μηχανισμός και συμβόλαιο
Μια συνάρτηση που ανοίγει πόρο χρειάζεται σαφή ιδιοκτήτη κλεισίματος. Η ιδιοκτησία θολώνει όταν helper δέχεται ονόματα και ανοιχτές ροές ή generator παράγει τιμές κρατώντας αρχείο ανοιχτό. Όρισε αν ο καλών μεταβιβάζει ιδιοκτησία ή δανείζει handle. Το κλείσιμο δανεικού handle μπορεί να καταστρέψει άλλο κώδικα, ενώ ανοιχτός ιδιόκτητος πόρος εξαντλεί descriptors.
Οι context managers κάνουν ορατό τον χρόνο ζωής και καθαρίζουν όταν το σώμα αποτυγχάνει. Απόκτησε πολλούς πόρους ώστε αποτυχία στη δεύτερη απόκτηση να απελευθερώνει τον πρώτο. Το ExitStack βοηθά όταν το πλήθος είναι δυναμικό. Ο καθαρισμός μπορεί επίσης να αποτύχει· κράτησε πλαίσιο αρχικής και τελικής εξαίρεσης αντί να αναφέρεις ανεπιφύλακτη επιτυχία.
Τοπικό παράδειγμα
from contextlib import ExitStack
import io
opened = []
try:
with ExitStack() as stack:
for text in ("one", "two"):
stream = stack.enter_context(io.StringIO(text))
opened.append(stream)
raise ValueError("fixture failure")
except ValueError:
pass
assert len(opened) == 2 and all(s.closed for s in opened)
print("owned streams closed")
Έλεγχοι αποτυχίας και όρια
Πρόσθεσε αποτυχία κατά την απόκτηση, όχι μόνο στο πλήρως αρχικοποιημένο σώμα. Επαλήθευσε ότι κανένας πόρος δεν διαφεύγει με ασαφή ιδιοκτησία. Ο destructor δεν εξασφαλίζει έγκαιρο καθαρισμό, ιδίως με κύκλους αναφορών ή τερματισμό διεργασίας. Σε ασύγχρονους πόρους χρησιμοποίησε το αντίστοιχο πρωτόκολλο και βεβαιώσου ότι η ακύρωση φτάνει στον καθαρισμό χωρίς να καταπίνεται από γενικό handler.