Mengendalikan Permintaan Proksi yang Gagal dengan asyncio.gather
Periksa pengecualian yang dikembalikan oleh asyncio.gather dan kekalkan setiap hasil dikaitkan dengan proksi yang dipilih.
asyncio.gather dengan return_exceptions=True meletakkan pengecualian tugas dalam senarai hasilnya. Jadi menunggu kelompok tanpa pengecualian tidak bermakna setiap permintaan proksi berjaya.
Simpan destinasi dan proksi yang dipilih bersama awaitable yang dihantar, kemudian periksa setiap hasil:
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 mengandungi korutin permintaan aplikasi; routes mengandungi pasangan (url, proxy) yang sepadan dalam susunan yang sama. Fungsi perakaman ialah pengendalian hasil aplikasi itu sendiri. gather mengekalkan susunan input walaupun susunan penyelesaian berbeza.
Kelaskan CancelledError yang dikembalikan oleh tugas anak sebagai pembatalan dan bukannya menyalahkan proksinya. Pembatalan gather luar masih merebak kepada anak yang belum selesai; return_exceptions tidak menjadikan pembatalan itu kejayaan biasa.
Pengendalian status HTTP juga terletak di dalam operasi permintaan. aiohttp tidak membangkitkan pengecualian bagi setiap ralat HTTP secara lalai, jadi kembalikan status atau gunakan raise_for_status mengikut dasar tugas.
Setelah hasil kelihatan, aplikasi boleh membezakan kegagalan sambungan daripada respons destinasi dan memutuskan kerja mana yang wajar dicuba sekali lagi.