asyncio.gather return_exceptions=True کے ساتھ کاموں کی مستثنیات کو اپنی نتائج کی فہرست میں رکھتا ہے۔ اس لیے بغیر کسی مستثنیٰ کے بیچ کا انتظار کرنے کا مطلب یہ نہیں کہ ہر پراکسی درخواست کامیاب ہوئی۔

منزل اور منتخب پراکسی کو جمع کردہ awaitable کے ساتھ رکھیں، پھر ہر نتیجے کا جائزہ لیں:

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 کو اس کی پراکسی کو قصوروار ٹھہرانے کے بجائے منسوخی کے طور پر درجہ بندی کریں۔ بیرونی gather کی منسوخی پھر بھی نامکمل بچوں تک پھیلتی ہے؛ return_exceptions اس منسوخی کو عام کامیابی میں تبدیل نہیں کرتا۔

HTTP اسٹیٹس کی سنبھال بھی درخواست کے عمل کے اندر ہے۔ aiohttp بطور ڈیفالٹ ہر HTTP غلطی پر مستثنیٰ نہیں اٹھاتا، اس لیے اسٹیٹس واپس کریں یا ٹاسک کی پالیسی کے مطابق raise_for_status لاگو کریں۔

نتائج سامنے آنے کے بعد ایپلیکیشن کنکشن کی ناکامیوں کو منزل کے جوابات سے الگ کر سکتی ہے اور طے کر سکتی ہے کہ کون سا کام ایک اور کوشش کے قابل ہے۔

متعلقہ مضامین