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 დავალების პოლიტიკის მიხედვით.

როცა შედეგები ხილული გახდება, აპლიკაციას შეუძლია კავშირის ხარვეზები დანიშნულების პასუხებისგან გაარჩიოს და გადაწყვიტოს, რომელი სამუშაო იმსახურებს კიდევ ერთ ცდას.

დაკავშირებული სტატიები