Kontroly proxy v Pythone: prečo Future.cancel() necháva vlákna bežať
Pochopte, prečo zrušenie čakajúcich futures nezastaví aktívne sieťové kontroly, a ohraničte preteky proxy bez tvrdenia, že dokazuje zdravie cieľa.
Jeden worker nájde použiteľnú proxy. Vrátite jej adresu, zavoláte cancel na ostatných futures a očakávate, že sieťová aktivita sa zastaví. Nemusí.
Future možno zrušiť predtým, než sa jeho callable spustí. Keď vlákno už vykonáva požiadavku, zrušenie jeho Future túto socketovú operáciu nepreruší. Worker potrebuje vlastnú obmedzenú sieťovú operáciu a cestu upratovania.
Na životnosti exekútora tiež záleží. Opustenie kontextu ThreadPoolExecutor čaká na dokončenie jeho práce. Nájdenie jedného rýchleho výsledku a následné čakanie na niekoľko pomalých workerov môže spôsobiť, že celkové oneskorenie volajúceho vôbec nepripomína latenciu hlásenú víťazom.
Ohraničte preteky skôr, než sa začnú
- Obmedzte počet súbežných kontrol namiesto odoslania neobmedzeného verejného zoznamu. Bezplatný zoznam proxy poskytuje kandidátov pre vstup kontrolóra, pričom protokol každého koncového bodu sa zachováva pre workera.
- Dajte každej požiadavke vhodnú politiku pripojenia a čítania.
- Dajte volajúcemu celkový rozpočet rozhodnutia.
- Určte, kto vyprázdňuje alebo zatvára výsledky workerov, ktoré prežijú rozhodnutie.
Kratšie čakanie na Future nie je to isté ako skrátenie jeho podkladovej požiadavky. Rovnako tak opustenie výsledku neuvoľní okamžite všetky sieťové zdroje.
Prvý úspešný výsledok je tiež len prvá úspešná kontrola. Môže závisieť od plánovania, kešovaných pripojení a konkrétneho cieľa kontroly. Nedokazuje, že koncový bod je univerzálne najrýchlejší alebo že skutočná úloha uspeje.
Často je malý udržiavaný fond s nedávnymi pozorovaniami jednoduchší než pretekanie s celým zoznamom pred každým stiahnutím. Použite výsledok skutočnej operácie na aktualizáciu záznamu spolu s kontrolovanou politikou obnovy pri zlyhaniach. Predbežná kontrola by si mala zarobiť svoje náklady namiesto zdvojnásobenia každej úlohy zo zvyku.