Un grupo de proxies puede contener puntos finales con capacidades muy distintas. Permitir cincuenta operaciones en toda la aplicación no impide que cuarenta y nueve de ellas elijan el mismo proxy.

Si la política es «como máximo cuatro operaciones en curso por cada proxy seleccionado», expresa esa política directamente. Mantén un semáforo por cada identidad de proxy y adquiérelo alrededor del trabajo que consume la capacidad del 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()

Este esquema supone que asyncio se ha importado y que las URL de los proxies se han validado. Para las solicitudes públicas en una ruta de proxy público permitida, la lista de proxies HTTP proporciona candidatos para las URL de proxy de aiohttp. Una aplicación real también debería establecer su propio tiempo de espera de solicitud y decidir cuántos datos de respuesta necesita. Leer un archivo grande por completo en memoria es una decisión de recursos aparte.

Conserva el permiso para la parte costosa

Liberar el semáforo en cuanto llegan las cabeceras de respuesta puede frustrar el límite previsto. Un cuerpo en streaming puede seguir usando la conexión mucho después. Conserva el permiso hasta que el cuerpo se haya consumido o la respuesta se haya cerrado según el flujo de trabajo de la aplicación.

Los gestores de contexto anidados hacen visible la limpieza cuando una excepción o cancelación abandona la operación. Evita adquirir manualmente y liberar solo al final de una función exitosa.

Los límites de conexión responden a otra pregunta

Los límites del conector de aiohttp limitan las conexiones según las reglas documentadas del conector. Siguen siendo útiles junto a un semáforo de aplicación. Un límite de conexiones por destino no expresa, solo por su nombre, un presupuesto compartido por todos los destinos asignados a un proxy.

Distingue también la concurrencia de la tasa de solicitudes. Cuatro solicitudes de larga duración y cuatro solicitudes muy cortas usan la misma asignación de concurrencia mientras producen tasas de solicitudes por segundo diferentes. Un servicio con una política de tasa puede requerir marcar el ritmo o un limitador de tasa separado.

Elige un identificador de proxy estable y no secreto para los registros y las métricas. Si dos URL con credenciales se refieren al mismo grupo de capacidad, decide si deben compartir un presupuesto. A la inversa, puertos o cuentas diferentes pueden representar límites separados cuando el operador lo documenta así.

Cuando cae el rendimiento, inspecciona dónde espera el trabajo: tu semáforo, el conector, el establecimiento de la conexión del proxy o las lecturas de respuesta. Subir todos los límites a la vez hace más difícil esa distinción y puede mover la cola hacia un proxy que no controlas.

Artículos relacionados