Un pool di proxy può contenere endpoint con capacità molto diverse. Consentire cinquanta operazioni nell'applicazione non impedisce a quarantanove di esse di scegliere lo stesso proxy.

Se la regola è «al massimo quattro operazioni in corso per ogni proxy selezionato», esprimi quella regola direttamente. Mantieni un semaforo per ogni identità di proxy e acquisiscilo attorno al lavoro che consuma la capacità 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()

Questo schema presuppone che asyncio sia stato importato e che gli URL dei proxy siano stati convalidati. Per le richieste pubbliche su un percorso proxy pubblico consentito, l'elenco dei proxy HTTP fornisce candidati per gli URL proxy di aiohttp. Un'applicazione reale dovrebbe anche impostare il proprio timeout di richiesta e decidere quanti dati di risposta le servono. Leggere un file grande interamente in memoria è una decisione separata sulle risorse.

Conserva il permesso per la parte costosa

Rilasciare il semaforo non appena arrivano le intestazioni della risposta può vanificare il limite previsto. Un corpo in streaming può continuare a usare la connessione molto tempo dopo. Conserva il permesso finché il corpo non è stato consumato o la risposta non è stata chiusa secondo il flusso di lavoro dell'applicazione.

I gestori di contesto annidati rendono visibile la pulizia quando un'eccezione o una cancellazione lascia l'operazione. Evita di acquisire manualmente e rilasciare solo in fondo a una funzione riuscita.

I limiti di connessione rispondono a un'altra domanda

I limiti del connettore di aiohttp limitano le connessioni secondo le regole documentate del connettore. Restano utili accanto a un semaforo dell'applicazione. Un limite di connessioni per destinazione non esprime, solo dal suo nome, un budget condiviso da tutte le destinazioni assegnate a un proxy.

Distingui anche la concorrenza dalla frequenza delle richieste. Quattro richieste di lunga durata e quattro richieste molto brevi usano la stessa quota di concorrenza pur producendo frequenze di richieste al secondo diverse. Un servizio con una regola di frequenza può richiedere cadenza o un limitatore di frequenza separato.

Scegli un identificatore di proxy stabile e non segreto per log e metriche. Se due URL con credenziali si riferiscono allo stesso pool di capacità, decidi se devono condividere un budget. Viceversa, porte o account diversi possono rappresentare limiti separati quando l'operatore li documenta così.

Quando il throughput cala, esamina dove il lavoro attende: il tuo semaforo, il connettore, la configurazione della connessione al proxy o la lettura delle risposte. Alzare tutti i limiti contemporaneamente rende più difficile questa distinzione e può spostare la coda in un proxy che non controlli.

Articoli correlati