Dați fiecărui proxy aiohttp propriul buget de concurență
Limitați munca în curs pentru fiecare proxy selectat, păstrând limitele pool-ului de conexiuni aiohttp și curățarea răspunsurilor.
Un pool de proxy-uri poate conține puncte finale cu capacități foarte diferite. Permiterea a cincizeci de operații în aplicație nu împiedică patruzeci și nouă dintre ele să aleagă același proxy.
Dacă politica este „cel mult patru operații în curs prin fiecare proxy selectat”, exprimați această politică direct. Păstrați un semafor pentru fiecare identitate de proxy și achiziționați-l în jurul muncii care consumă capacitatea proxy-ului.
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()Această schiță presupune că asyncio a fost importat și că URL-urile proxy au fost validate. Pentru cereri publice pe o rută publică de proxy permisă, lista de proxy-uri HTTP furnizează candidați pentru URL-urile de proxy ale aiohttp. O aplicație reală ar trebui să își stabilească propriul timeout de cerere și să decidă câte date de răspuns are nevoie. Citirea unui fișier mare complet în memorie este o decizie separată privind resursele.
Păstrați permisiunea pentru partea costisitoare
Eliberarea semaforului imediat ce sosesc anteturile răspunsului poate zădărnici limita dorită. Un corp transmis în flux poate continua să folosească conexiunea mult timp după aceea. Păstrați permisiunea până când corpul este consumat sau răspunsul este închis conform fluxului de lucru al aplicației.
Managerii de context imbricați fac curățarea vizibilă atunci când o excepție sau o anulare părăsește operația. Evitați achiziționarea manuală și eliberarea doar la baza unei funcții reușite.
Limitele de conexiune răspund la o altă întrebare
Limitele conectorului aiohttp limitează conexiunile conform regulilor documentate ale conectorului. Ele rămân utile alături de un semafor al aplicației. O limită de conexiuni per destinație nu exprimă, doar prin numele său, un buget partajat de toate destinațiile atribuite unui proxy.
Distingeți și concurența de rata cererilor. Patru cereri de lungă durată și patru cereri foarte scurte folosesc aceeași alocație de concurență, dar produc rate de cereri pe secundă diferite. Un serviciu cu o politică de rată poate necesita reglarea ritmului sau un limitator de rată separat.
Alegeți un identificator de proxy stabil și ne-secret pentru jurnale și metrici. Dacă două URL-uri cu acreditări se referă la același pool de capacitate, decideți dacă ar trebui să împartă un buget. Invers, porturi sau conturi diferite pot reprezenta limite separate atunci când operatorul le documentează astfel.
Când debitul scade, inspectați unde așteaptă munca: semaforul dvs., conectorul, stabilirea conexiunii proxy sau citirea răspunsurilor. Creșterea tuturor limitelor deodată face această distincție mai dificilă și poate muta coada într-un proxy pe care nu îl controlați.