Vérifications de proxy en Python : pourquoi Future.cancel() laisse les threads actifs
Comprenez pourquoi l'annulation de futures en attente n'arrête pas les vérifications réseau actives, et encadrez une course de proxy sans prétendre qu'elle prouve la santé de la destination.
Un worker trouve un proxy utilisable. Vous renvoyez son adresse, appelez cancel sur les autres futures et vous attendez à ce que l'activité réseau s'arrête. Elle pourrait ne pas s'arrêter.
Un Future peut être annulé avant le démarrage de son callable. Dès qu'un thread exécute déjà une requête, annuler son Future n'interrompt pas cette opération de socket. Le worker a besoin de sa propre opération réseau bornée et d'un chemin de nettoyage.
La durée de vie de l'executor compte aussi. Quitter un contexte ThreadPoolExecutor attend la fin de son travail. Trouver un résultat rapide puis attendre plusieurs workers lents peut rendre le délai total de l'appelant totalement différent de la latence rapportée par le gagnant.
Encadrez la course avant de la lancer
- Limitez le nombre de vérifications simultanées au lieu de soumettre une liste publique non bornée. La liste gratuite de proxys fournit des candidats à l'entrée du vérificateur, le protocole de chaque point de terminaison étant conservé pour le worker.
- Donnez à chaque requête une politique de connexion et de lecture appropriée.
- Donnez à l'appelant un budget de décision global.
- Définissez qui vide ou ferme les résultats des workers qui survivent à la décision.
Attendre moins longtemps un Future n'est pas la même chose que raccourcir sa requête sous-jacente. De même, abandonner le résultat ne libère pas immédiatement toutes les ressources réseau.
Le premier résultat réussi n'est aussi que la première vérification réussie. Il peut dépendre de l'ordonnancement, des connexions en cache et de la destination de vérification particulière. Il n'établit pas que le point de terminaison est universellement le plus rapide ni que la tâche réelle réussira.
Souvent, un petit pool conservé avec des observations récentes est plus simple que de courir sur toute la liste avant chaque téléchargement. Utilisez le résultat de l'opération réelle pour mettre à jour l'enregistrement, avec une politique de récupération contrôlée pour les échecs. La vérification préalable devrait gagner son coût plutôt que de doubler chaque tâche par habitude.