Праверкі Python-проксі: чаму Future.cancel() пакідае патокі працаваць
Зразумейце, чаму адмена чаканых future не спыняе актыўныя сеткавыя праверкі, і абмяжуйце гонку проксі, не сцвярджаючы, што яна даказвае здароўе прызначэння.
Адзін worker знаходзіць прыдатны проксі. Вы вяртаеце яго адрас, выклікаеце cancel для іншых future і чакаеце, што сеткавая актыўнасць спыніцца. Гэта можа не адбыцца.
Future можна адмяніць да запуску яго callable. Калі паток ужо выконвае запыт, адмена яго Future не перарывае гэтую аперацыю з сокетам. Worker патрэбна ўласная абмежаваная сеткавая аперацыя і шлях ачысткі.
Тэрмін жыцця executor таксама мае значэнне. Выхад з кантэксту ThreadPoolExecutor чакае завяршэння яго працы. Знайсці адзін хуткі вынік, а потым чакаць некалькіх павольных worker, можа зрабіць агульную затрымку выклікальніка зусім не падобнай на зарэгістраваную латэнтнасць пераможцы.
Абмяжуйце гонку да яе пачатку
- Абмяжуйце колькасць адначасовых праворак замест падачы неабмежаванага публічнага спісу. Бясплатны спіс проксі дае кандыдатаў для ўводу правяральніка, прычым пратакол кожнай канцавой кропкі захоўваецца для worker.
- Дайце кожнаму запыту адпаведную палітыку злучэння і чытання.
- Дайце выклікальніку агульны бюджэт рашэння.
- Вызначце, хто злівае або закрывае вынікі worker, якія перажываюць рашэнне.
Менш чакаць Future — гэта не тое самае, што зрабіць яго асноўны запыт карацейшым. Гэтак жа адмова ад выніку не вызваляе адразу ўсе сеткавыя рэсурсы.
Першы паспяховы вынік — гэта таксама толькі першая паспяховая праверка. Ён можа залежаць ад планавання, кэшаваных злучэнняў і канкрэтнага прызначэння праверкі. Ён не даказвае, што канцавая кропка ўніверсальна самая хуткая або што рэальная задача ўдасца.
Часта невялікі захаваны пул з нядаўнімі назіраннямі прасцейшы, чым гонка па ўсім спісе перад кожным спампоўваннем. Выкарыстоўвайце вынік рэальнай аперацыі для абнаўлення запісу, з кантраляванай палітыкай аднаўлення пасля збояў. Папярэдняя праверка павінна апраўдваць свае выдаткі, а не падвойваць кожную задачу па звычцы.