Το 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 σύμφωνα με την πολιτική της εργασίας.

Μόλις τα αποτελέσματα γίνουν ορατά, η εφαρμογή μπορεί να διακρίνει τις αποτυχίες σύνδεσης από τις απαντήσεις του προορισμού και να αποφασίσει ποια εργασία αξίζει μια ακόμη προσπάθεια.

Σχετικά άρθρα