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 প্রয়োগ করুন।

ফলাফল দৃশ্যমান হলে অ্যাপ্লিকেশন সংযোগ ব্যর্থতা ও গন্তব্যের প্রতিক্রিয়ার মধ্যে পার্থক্য করতে পারে এবং কোন কাজ আরেকটি চেষ্টার যোগ্য তা নির্ধারণ করতে পারে।

সম্পর্কিত নিবন্ধ