Daj każdemu proxy aiohttp własny budżet współbieżności
Ogranicz pracę w toku na wybranym proxy, zachowując limity puli połączeń aiohttp i czyszczenie odpowiedzi.
Pula proxy może zawierać punkty końcowe o bardzo różnej wydajności. Zezwolenie na pięćdziesiąt operacji w aplikacji nie powstrzymuje czterdziestu dziewięciu z nich przed wybraniem tego samego proxy.
Jeśli zasadą jest „najwyżej cztery operacje w toku przez każde wybrane proxy”, wyraź tę zasadę wprost. Trzymaj semafor dla każdej tożsamości proxy i pozyskuj go wokół pracy, która zużywa wydajność proxy.
limits = {proxy: asyncio.Semaphore(4) for proxy in proxy_urls}
async def fetch(session, proxy, url):
async with limits[proxy]:
async with session.get(url, proxy=proxy) as response:
return await response.read()Ten szkic zakłada, że asyncio został zaimportowany, a adresy URL proxy zostały zweryfikowane. Dla publicznych żądań na dozwolonej publicznej trasie proxy lista proxy HTTP dostarcza kandydatów na adresy URL proxy aiohttp. Prawdziwa aplikacja powinna także ustawić własny limit czasu żądania i zdecydować, ile danych odpowiedzi potrzebuje. Wczytanie dużego pliku w całości do pamięci to odrębna decyzja dotycząca zasobów.
Zachowaj pozwolenie na kosztowną część
Zwolnienie semafora, gdy tylko przyjdą nagłówki odpowiedzi, może zniweczyć zamierzony limit. Przesyłane strumieniowo ciało może nadal używać połączenia znacznie dłużej. Zachowaj pozwolenie, dopóki ciało nie zostanie zużyte lub odpowiedź nie zostanie zamknięta zgodnie z przepływem pracy aplikacji.
Zagnieżdżone menedżery kontekstu czynią czyszczenie widocznym, gdy wyjątek lub anulowanie opuszcza operację. Unikaj ręcznego pozyskiwania i zwalniania tylko na końcu udanej funkcji.
Limity połączeń odpowiadają na inne pytanie
Limity łącznika aiohttp ograniczają połączenia zgodnie z udokumentowanymi regułami łącznika. Pozostają przydatne obok semafora aplikacji. Limit połączeń na cel nie wyraża samą nazwą budżetu współdzielonego przez wszystkie cele przypisane do jednego proxy.
Odróżniaj też współbieżność od szybkości żądań. Cztery długotrwałe żądania i cztery bardzo krótkie żądania korzystają z tego samego przydziału współbieżności, ale dają różne szybkości żądań na sekundę. Usługa z zasadą szybkości może wymagać regulacji tempa lub osobnego ogranicznika szybkości.
Wybierz stabilny, nie-tajny identyfikator proxy do logów i metryk. Jeśli dwa adresy URL z poświadczeniami odnoszą się do tej samej puli wydajności, zdecyduj, czy powinny dzielić jeden budżet. Odwrotnie, różne porty lub konta mogą oznaczać osobne limity, gdy operator tak je dokumentuje.
Gdy przepustowość spada, sprawdź, gdzie praca czeka: twój semafor, łącznik, nawiązywanie połączenia z proxy czy odczyt odpowiedzi. Podniesienie wszystkich limitów naraz utrudnia to rozróżnienie i może przenieść kolejkę do proxy, którego nie kontrolujesz.