Récupérer chaque résultat des requêtes proxy urllib3 concurrentes
Partagez un ProxyManager configuré entre les threads de travail, consommez l'itérateur de résultats de l'exécuteur et distinguez la rétention du pool d'une limite de connexions.
Créer un pool de travailleurs ne fournit pas au demandeur les pages téléchargées. Conservez et consommez les valeurs renvoyées par le travail soumis :
from concurrent.futures import ThreadPoolExecutor
import urllib3
manager = urllib3.ProxyManager(
'http://proxy.example:8080',
maxsize=4,
block=True,
)
def fetch(url):
response = manager.request(
'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
)
return url, response.status, response.data
try:
with ThreadPoolExecutor(max_workers=4) as workers:
results = list(workers.map(fetch, urls))
finally:
manager.clear()Cet extrait suppose une liste d'URL bornée et des tailles de réponse ordinaires. Pour des contrôles d'URL publiques autorisés sans authentification proxy, un candidat de la liste de proxys HTTP peut remplacer le point de terminaison HTTP d'exemple du gestionnaire. Chaque résultat inclut son URL afin que le demandeur puisse associer le statut et le corps à la bonne requête. map renvoie les résultats dans l'ordre d'entrée ; une exception dans un travailleur est levée lorsque ce résultat est récupéré.
Le ProxyManager configuré possède la mise en commun des connexions pour les requêtes. Avec le mode de réponse préchargée par défaut utilisé ici, urllib3 lit le corps et renvoie la connexion à son pool. Une version en streaming nécessiterait une consommation explicite et une libération de la connexion.
maxsize contrôle normalement les connexions réutilisables conservées, et non un plafond strict pour chaque socket ouvert. block=True modifie le comportement du pool concerné afin que les appelants attendent une connexion libre plutôt que d'en ouvrir d'autres au-delà de la limite de ce pool.
Le nombre de travailleurs borne les appels concurrents dans cet exemple. Avec de nombreuses destinations, l'agencement du pool et la route utilisée pour les tunnels HTTPS comptent aussi ; un réglage par pool ne doit pas être décrit comme un quota global de sockets pour chaque hôte.