Python-proxykontroller: hvorfor Future.cancel() lader tråde køre videre
Forstå hvorfor annullering af ventende futures ikke stopper aktive netværkskontroller, og afgræns et proxykapløb uden at hævde, at det beviser destinationens sundhed.
Én worker finder en brugbar proxy. Du returnerer dens adresse, kalder cancel på de andre futures og forventer, at netværksaktiviteten stopper. Det gør den måske ikke.
En Future kan annulleres, før dens callable starter. Når en tråd allerede udfører en anmodning, afbryder annullering af dens Future ikke den socket-operation. Workeren har brug for sin egen afgrænsede netværksoperation og oprydningsvej.
Executor'ens levetid betyder også noget. At forlade en ThreadPoolExecutor-kontekst venter på, at dens arbejde bliver færdigt. At finde ét hurtigt resultat og derefter vente på flere langsomme workere kan få den samlede forsinkelse for kalderen til at se helt anderledes ud end vinderens rapporterede latenstid.
Afgræns kapløbet, før det begynder
- Begræns antallet af samtidige kontroller i stedet for at indsende en ubegrænset offentlig liste. Den gratis proxyliste leverer kandidater til kontrollerens input, mens hver endepunkts protokol bevares for workeren.
- Giv hver anmodning en passende forbindelses- og læsepolitik.
- Giv kalderen et samlet beslutningsbudget.
- Definér, hvem der dræner eller lukker resultater fra workere, der overlever beslutningen.
At vente mindre på en Future er ikke det samme som at gøre dens underliggende anmodning kortere. På samme måde frigiver det ikke øjeblikkeligt alle netværksressourcer at opgive resultatet.
Det første vellykkede resultat er også kun den første vellykkede kontrol. Det kan afhænge af planlægning, cachede forbindelser og den konkrete kontroldestination. Det fastslår ikke, at endepunktet er universelt det hurtigste, eller at den rigtige opgave vil lykkes.
Ofte er en lille bibeholdt pulje med nyere observationer enklere end at race hele listen før hver download. Brug den rigtige operations resultat til at opdatere posten, med en kontrolleret gendannelsespolitik for fejl. Forhåndskontrollen bør tjene sine omkostninger i stedet for at fordoble hver opgave af vane.