พูลพร็อกซี่อาจมีปลายทางที่มีความสามารถต่างกันมาก การอนุญาตให้มีห้าสิบการดำเนินการทั่วทั้งแอปพลิเคชันไม่ได้ป้องกันไม่ให้สี่สิบเก้าในนั้นเลือกพร็อกซี่เดียวกัน

หากนโยบายคือ «การดำเนินการที่กำลังทำอยู่ไม่เกินสี่รายการผ่านพร็อกซี่ที่เลือกแต่ละตัว» ให้แสดงนโยบายนั้นโดยตรง เก็บเซมาฟอร์สำหรับแต่ละอัตลักษณ์พร็อกซี่ และรับมันรอบงานที่ใช้ความสามารถของพร็อกซี่

limits = {proxy: asyncio.Semaphore(4) for proxy in proxy_urls}

async def fetch(session, proxy, url):
    async with limits[proxy]:
        async with session.get(url, proxy=proxy) as response:
            return await response.read()

แบบร่างนี้ถือว่า asyncio ถูกนำเข้าแล้วและ URL ของพร็อกซี่ได้รับการตรวจสอบแล้ว สำหรับคำขอสาธารณะบนเส้นทางพร็อกซี่สาธารณะที่ได้รับอนุญาต รายการพร็อกซี่ HTTP ให้ผู้สมัครสำหรับ URL พร็อกซี่ของ aiohttp แอปพลิเคชันจริงควรกำหนดเวลาหมดเวลาของคำขอเองและตัดสินว่าต้องการข้อมูลคำตอบเท่าใด การอ่านไฟล์ขนาดใหญ่ทั้งหมดเข้าสู่หน่วยความจำเป็นการตัดสินใจเรื่องทรัพยากรแยกต่างหาก

เก็บใบอนุญาตไว้สำหรับส่วนที่แพง

การปล่อยเซมาฟอร์ทันทีที่ส่วนหัวของคำตอบมาถึงอาจทำให้ขีดจำกัดที่ตั้งใจไว้ล้มเหลว เนื้อความแบบสตรีมมิ่งอาจใช้การเชื่อมต่อต่อไปอีกนานหลังจากนั้น เก็บใบอนุญาตไว้จนกว่าเนื้อความจะถูกใช้หมดหรือคำตอบถูกปิดตามลำดับงานของแอปพลิเคชัน

ตัวจัดการบริบทแบบซ้อนทำให้การทำความสะอาดมองเห็นได้เมื่อข้อยกเว้นหรือการยกเลิกออกจากการดำเนินการ หลีกเลี่ยงการรับด้วยมือและการปล่อยเฉพาะที่ด้านล่างของฟังก์ชันที่สำเร็จ

ขีดจำกัดการเชื่อมต่อตอบคำถามอื่น

ขีดจำกัดของคอนเน็กเตอร์ aiohttp จำกัดการเชื่อมต่อตามกฎที่บันทึกไว้ของคอนเน็กเตอร์ ขีดจำกัดยังมีประโยชน์ควบคู่กับเซมาฟอร์ของแอปพลิเคชัน ขีดจำกัดการเชื่อมต่อต่อปลายทางไม่ได้แสดงถึง ตามชื่อของมันเพียงอย่างเดียว งบประมาณที่ใช้ร่วมกันโดยปลายทางทั้งหมดที่กำหนดให้พร็อกซี่เดียว

แยกการทำงานพร้อมกันออกจากอัตราคำขอด้วย สี่คำขออายุยืนและสี่คำขอที่สั้นมากใช้โควตาการทำงานพร้อมกันเดียวกันแต่ให้อัตราคำขอต่อวินาทีที่ต่างกัน บริการที่มีนโยบายอัตราอาจต้องควบคุมจังหวะหรือใช้ตัวจำกัดอัตราแยก

เลือกตัวระบุพร็อกซี่ที่เสถียรและไม่เป็นความลับสำหรับบันทึกและเมตริก หาก URL สองรายการที่มีข้อมูลรับรองอ้างถึงพูลความสามารถเดียวกัน ให้ตัดสินว่าควรแบ่งงบประมาณเดียวกันหรือไม่ ในทางกลับกัน พอร์ตหรือบัญชีที่ต่างกันอาจแทนขีดจำกัดแยกเมื่อผู้ดูแลระบบบันทึกไว้เช่นนั้น

เมื่อปริมาณงานลดลง ให้ตรวจสอบว่ามีงานรออยู่ที่ใด: เซมาฟอร์ของคุณ คอนเน็กเตอร์ การตั้งค่าการเชื่อมต่อพร็อกซี่ หรือการอ่านคำตอบ การเพิ่มขีดจำกัดทั้งหมดพร้อมกันทำให้แยกความแตกต่างได้ยากขึ้นและอาจย้ายคิวไปยังพร็อกซี่ที่คุณไม่ได้ควบคุม

บทความที่เกี่ยวข้อง