Controlli proxy in Python: perché Future.cancel() lascia i thread in esecuzione
Capite perché annullare i future in attesa non ferma i controlli di rete attivi e limitate una corsa proxy senza affermare che dimostri la salute della destinazione.
Un worker trova un proxy utilizzabile. Restituite il suo indirizzo, chiamate cancel sugli altri future e vi aspettate che l'attività di rete si fermi. Potrebbe non fermarsi.
Un Future può essere annullato prima che il suo callable inizi. Una volta che un thread sta già eseguendo una richiesta, annullare il suo Future non interrompe quell'operazione socket. Il worker ha bisogno di una propria operazione di rete limitata e di un percorso di pulizia.
Anche la durata dell'executor conta. Uscire da un contesto ThreadPoolExecutor attende che il suo lavoro finisca. Trovare un risultato veloce e poi attendere diversi worker lenti può far sembrare il ritardo totale del chiamante del tutto diverso dalla latenza riportata dal vincitore.
Limitate la corsa prima di iniziarla
- Limitate il numero di controlli simultanei invece di inviare una lista pubblica illimitata. La lista gratuita di proxy fornisce candidati per l'input del controllore, con il protocollo di ogni endpoint conservato per il worker.
- Date a ogni richiesta una politica di connessione e lettura appropriata.
- Date al chiamante un budget decisionale complessivo.
- Definite chi drena o chiude i risultati dei worker che sopravvivono alla decisione.
Aspettare meno un Future non equivale ad accorciare la sua richiesta sottostante. Allo stesso modo, abbandonare il risultato non libera immediatamente ogni risorsa di rete.
Il primo risultato riuscito è anche solo il primo controllo riuscito. Può dipendere dalla pianificazione, dalle connessioni in cache e dalla particolare destinazione del controllo. Non stabilisce che l'endpoint sia universalmente il più veloce né che il compito reale avrà successo.
Spesso un piccolo pool mantenuto con osservazioni recenti è più semplice che gareggiare con l'intera lista prima di ogni download. Usate il risultato dell'operazione reale per aggiornare il record, con una politica di ripristino controllata per i guasti. Il controllo preliminare dovrebbe guadagnarsi il suo costo invece di raddoppiare ogni attività per abitudine.