Διαχείριση αποτυχημένων αιτημάτων proxy με το asyncio.gather
Εξετάστε τις εξαιρέσεις που επιστρέφει το asyncio.gather και κρατήστε κάθε αποτέλεσμα συνδεδεμένο με το επιλεγμένο proxy.
Το asyncio.gather με return_exceptions=True τοποθετεί τις εξαιρέσεις των εργασιών στη λίστα αποτελεσμάτων του. Επομένως, η αναμονή της παρτίδας χωρίς εξαίρεση δεν σημαίνει ότι κάθε αίτημα proxy πέτυχε.
Κρατήστε τον προορισμό και το επιλεγμένο proxy δίπλα στα awaitables που υποβλήθηκαν και έπειτα εξετάστε κάθε αποτέλεσμα:
outcomes = await asyncio.gather(*jobs, return_exceptions=True)
for (url, proxy), outcome in zip(routes, outcomes):
if isinstance(outcome, BaseException):
record_failure(url, proxy, outcome)
else:
record_success(url, proxy, outcome)
Το jobs περιέχει τις κορουτίνες αιτημάτων της εφαρμογής· το routes περιέχει τα αντίστοιχα ζεύγη (url, proxy) με την ίδια σειρά. Οι συναρτήσεις καταγραφής είναι η δική της διαχείριση αποτελεσμάτων της εφαρμογής. Το gather διατηρεί τη σειρά εισόδου ακόμη και όταν η σειρά ολοκλήρωσης διαφέρει.
Χαρακτηρίστε ένα επιστρεφόμενο CancelledError θυγατρικής εργασίας ως ακύρωση αντί να κατηγορήσετε το proxy της. Η ακύρωση του εξωτερικού gather εξακολουθεί να διαδίδεται στα ημιτελή παιδιά· το return_exceptions δεν μετατρέπει αυτή την ακύρωση σε συνηθισμένη επιτυχία.
Η διαχείριση της κατάστασης HTTP ανήκει επίσης μέσα στη λειτουργία του αιτήματος. Το aiohttp δεν εγείρει εξαίρεση για κάθε σφάλμα HTTP εξ ορισμού, οπότε επιστρέψτε την κατάσταση ή εφαρμόστε raise_for_status σύμφωνα με την πολιτική της εργασίας.
Μόλις τα αποτελέσματα γίνουν ορατά, η εφαρμογή μπορεί να διακρίνει τις αποτυχίες σύνδεσης από τις απαντήσεις του προορισμού και να αποφασίσει ποια εργασία αξίζει μια ακόμη προσπάθεια.