Пул проксі може містити кінцеві точки з дуже різною пропускною здатністю. Дозвіл п’ятдесяти операцій у всій програмі не заважає сорока дев’яти з них вибрати той самий проксі.

Якщо правило — «не більше чотирьох поточних операцій через кожен вибраний проксі», висловіть це правило прямо. Тримайте семафор для кожної ідентичності проксі й захоплюйте його навколо роботи, що споживає його пропускну здатність.

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()

Цей начерк припускає, що asyncio уже імпортовано, а URL проксі перевірено. Для публічних запитів на дозволеному публічному маршруті проксі список HTTP-проксі надає кандидатів для URL проксі aiohttp. Справжній застосунок також має встановити власний тайм-аут запиту й вирішити, скільки даних відповіді йому потрібно. Читання великого файлу повністю в пам’ять — окреме рішення щодо ресурсів.

Зберігайте дозвіл для дорогої частини

Звільнення семафора одразу після надходження заголовків відповіді може звести нанівець задумане обмеження. Потокове тіло може продовжувати використовувати з’єднання ще довго. Зберігайте дозвіл, доки тіло не вичерпано або відповідь не закрито згідно з робочим процесом застосунку.

Вкладені контекстні менеджери роблять очищення видимим, коли виняток або скасування залишає операцію. Уникайте ручного захоплення й звільнення лише в кінці успішної функції.

Ліміти з’єднань відповідають на інше питання

Ліміти конектора aiohttp обмежують з’єднання за документованими правилами конектора. Вони залишаються корисними поряд із семафором застосунку. Ліміт з’єднань на пункт призначення не виражає, лише за своїм ім’ям, бюджет, спільний для всіх пунктів призначення, призначених одному проксі.

Розрізняйте також паралельність і частоту запитів. Чотири довготривалі запити й чотири дуже короткі запити використовують ту саму квоту паралельності, але дають різну частоту запитів за секунду. Сервісу з політикою частоти може знадобитися вирівнювання темпу або окремий обмежувач частоти.

Вибирайте стабільний, несекретний ідентифікатор проксі для журналів і метрик. Якщо два URL з обліковими даними посилаються на один і той самий пул ємності, вирішіть, чи мають вони ділити один бюджет. І навпаки, різні порти або облікові записи можуть являти собою окремі ліміти, якщо оператор документує їх саме так.

Коли пропускна здатність падає, перевірте, де чекає робота: ваш семафор, конектор, встановлення з’єднання з проксі чи читання відповідей. Одночасне підвищення всіх лімітів ускладнює це розрізнення й може перемістити чергу в проксі, який ви не контролюєте.

Схожі статті