การตรวจสอบพร็อกซีด้วย Python: ทำไม Future.cancel() จึงปล่อยให้เธรดทำงานต่อ
ทำความเข้าใจว่าทำไมการยกเลิก future ที่รออยู่จึงไม่หยุดการตรวจสอบเครือข่ายที่ทำงานอยู่ และจำกัดการแข่งขันพร็อกซีโดยไม่อ้างว่าพิสูจน์สุขภาพปลายทาง
worker หนึ่งตัวพบพร็อกซีที่ใช้งานได้ คุณส่งคืนที่อยู่ เรียก cancel บน future อื่น ๆ และคาดว่ากิจกรรมเครือข่ายจะหยุด อาจไม่หยุดก็ได้
Future สามารถถูกยกเลิกก่อนที่ callable จะเริ่ม เมื่อเธรดกำลังเรียกใช้คำขออยู่แล้ว การยกเลิก Future ของเธรดนั้นไม่ขัดจังหวะการทำงานของซ็อกเก็ตนั้น worker ต้องการการทำงานเครือข่ายที่มีขอบเขตของตัวเองและเส้นทางการทำความสะอาด
อายุการใช้งานของ executor ก็สำคัญ การออกจากบริบท ThreadPoolExecutor จะรอให้งานเสร็จ การพบผลลัพธ์เร็วหนึ่งรายการแล้วรอ worker ที่ช้าหลายตัวอาจทำให้ความล่าช้ารวมของผู้เรียกไม่เหมือนกับเวลาแฝงที่ผู้ชนะรายงานเลย
จำกัดการแข่งขันก่อนเริ่ม
- จำกัดจำนวนการตรวจสอบพร้อมกันแทนการส่งรายการสาธารณะที่ไม่จำกัด รายการพร็อกซีฟรี ให้ผู้สมัครสำหรับอินพุตของผู้ตรวจสอบ โดยเก็บโปรโตคอลของแต่ละปลายทางไว้ให้ worker
- ให้แต่ละคำขอมีนโยบายการเชื่อมต่อและการอ่านที่เหมาะสม
- ให้งบประมาณการตัดสินใจโดยรวมแก่ผู้เรียก
- กำหนดว่าใครจะระบายหรือปิดผลลัพธ์จาก worker ที่มีอายุยืนกว่าการตัดสินใจ
การรอ Future น้อยลงไม่เหมือนกับการทำให้คำขอพื้นฐานสั้นลง เช่นเดียวกัน การทิ้งผลลัพธ์ไม่ได้ปล่อยทรัพยากรเครือข่ายทั้งหมดทันที
ผลลัพธ์ที่สำเร็จรายการแรกก็เป็นเพียงการตรวจสอบที่สำเร็จรายการแรกเท่านั้น มันอาจขึ้นอยู่กับการจัดตาราง การเชื่อมต่อที่แคชไว้ และปลายทางการตรวจสอบเฉพาะ ไม่ได้ยืนยันว่าปลายทางนั้นเร็วที่สุดในระดับสากลหรือว่างานจริงจะสำเร็จ
บ่อยครั้งพูลเล็ก ๆ ที่เก็บไว้พร้อมการสังเกตล่าสุดนั้นง่ายกว่าการแข่งขันกับรายการทั้งหมดก่อนทุกการดาวน์โหลด ใช้ผลลัพธ์ของการดำเนินการจริงเพื่ออัปเดตบันทึก พร้อมกับ นโยบายการกู้คืนที่ควบคุมได้สำหรับความล้มเหลว การตรวจสอบล่วงหน้าควรคุ้มค่ากับต้นทุน แทนที่จะเพิ่มงานทุกอย่างเป็นสองเท่าตามนิสัย