asyncio.gather ile başarısız proxy isteklerini ele almak
asyncio.gather'ın döndürdüğü istisnaları inceleyin ve her sonucu seçilen proxy ile ilişkili tutun.
asyncio.gather, return_exceptions=True ile görev istisnalarını sonuç listesine koyar. Bu nedenle grubu istisna olmadan beklemek, her proxy isteğinin başarılı olduğu anlamına gelmez.
Hedefi ve seçilen proxy'yi gönderilen awaitable'ların yanında tutun, ardından her sonucu inceleyin:
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, uygulamanın istek coroutine'lerini içerir; routes ise bunlara karşılık gelen (url, proxy) çiftlerini aynı sırayla içerir. Kayıt fonksiyonları uygulamanın kendi sonuç işlemesidir. gather, tamamlanma sırası farklı olsa bile giriş sırasını korur.
Bir alt görevden dönen CancelledError'ı, proxy'sini suçlamak yerine iptal olarak sınıflandırın. Dış gather'ın iptali yine de tamamlanmamış alt görevlere yayılır; return_exceptions bu iptali sıradan bir başarıya dönüştürmez.
HTTP durumu işleme de istek işleminin içinde yer alır. aiohttp varsayılan olarak her HTTP hatası için istisna yükseltmez, bu yüzden durumu döndürün veya görevin politikasına göre raise_for_status uygulayın.
Sonuçlar görünür olduğunda uygulama bağlantı hatalarını hedefin yanıtlarından ayırabilir ve hangi işin bir denemeyi daha hak ettiğine karar verebilir.