ເມື່ອຫຼາຍທຣິດແບ່ງປັນພູລພຣັອກຊີນ້ອຍໜຶ່ງ, ການເລືອກລາຍການແບບສຸ່ມອາດເຮັດໃຫ້ສອງການເຮັດວຽກທີ່ກຳລັງເຮັດຢູ່ໄດ້ພຣັອກຊີດຽວກັນ. ຄິວສາມາດເກັບລາຍການທີ່ມີຢູ່ສຳລັບການຢືມໃນຕອນນີ້:

from contextlib import contextmanager
from queue import Queue

available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
    available.put(endpoint)

@contextmanager
def borrow_proxy():
    endpoint = available.get(timeout=5)
    try:
        yield endpoint
    finally:
        available.put(endpoint)

def process_url(url):
    with borrow_proxy() as endpoint:
        return fetch_one(url, endpoint)

ສ້າງຄິວຄັ້ງດຽວ ກ່ອນເລີ່ມທຣິດຜູ້ເຮັດວຽກ. proxy_urls ມີ URL ປາຍທາງທີ່ຄົບຖ້ວນ. ຜູ້ສະໝັກສາທາລະນະມີຢູ່ໃນລາຍຊື່ພຣັອກຊີຟຣີ; ໃຊ້ໂປຣໂຕຄອນ ແລະ ຮູບແບບ URL ທີ່ fetch_one ຮອງຮັບ. ຟັງຊັນ fetch_one ແບບຊິງຄຣອນັສທີ່ມີຢູ່ແລ້ວຕ້ອງເຮັດວຽກເຄືອຂ່າຍໃຫ້ສຳເລັດ ແລະ ປິດການຕອບສະໜອງໃດໆ ກ່ອນທີ່ຈະກັບຄືນ. ຖ້າບໍ່ດັ່ງນັ້ນ ການໃຫ້ຢືມຈະສິ້ນສຸດຂະນະທີ່ການເຊື່ອມຕໍ່ຍັງໃຊ້ພຣັອກຊີນັ້ນຢູ່.

Queue.get ລຶບລາຍການທີ່ມີຢູ່ໜຶ່ງລາຍການຢ່າງອາຕອມິກ. ພູລທີ່ໝົດແລ້ວຈະລໍຖ້າ ແທນທີ່ຈະສະແກນທຸງທີ່ແບ່ງປັນຊ້ຳໆ. ຖ້າບໍ່ມີລາຍການມາຮອດພາຍໃນຫ້າວິນາທີ queue.Empty ຈະໄປຮອດຜູ້ເອີ້ນ; ເລືອກນະໂຍບາຍການລອງຄືນ, ຄວາມລົ້ມເຫຼວ ຫຼື ການຍົກເລີກຂອງແອັບພລິເຄຊັນສຳລັບຜົນນັ້ນ.

ບລັອກ finally ສົ່ງຄືນລາຍການທີ່ໄດ້ມາຫຼັງຈາກຄວາມສຳເລັດ ຫຼື ຂໍ້ຍົກເວັ້ນ. ມັນບໍ່ໄດ້ປະກາດວ່າປາຍທາງທີ່ລົ້ມເຫຼວມີສຸຂະພາບດີ. ນະໂຍບາຍການກັກກັນ, ການປ່ຽນແທນ ແລະ ການເຮັດໃຫ້ເຢັນຕ້ອງການເສັ້ນທາງທີ່ຊັດເຈນ ແທນທີ່ຈະຖິ້ມພຣັອກຊີທຸກອັນທີ່ເຫັນຂໍ້ຜິດພາດຊົ່ວຄາວຢ່າງງຽບໆ.

ການລຶບຂໍ້ຄວາມ URL ທີ່ຊ້ຳກັນອອກປ້ອງກັນລາຍການຄິວທີ່ຊ້ຳກັນ. URL ທີ່ແຕກຕ່າງກັນຍັງສາມາດອ້າງອີງພຣັອກຊີທາງກາຍະພາບດຽວກັນ ຫຼື ທາງອອກ; ຈັດກຸ່ມພວກມັນຢ່າງຕັ້ງໃຈ ຖ້າຄວາມພິເສດຕ້ອງນຳໃຊ້ກັບຊັບພະຍາກອນທີ່ແບ່ງປັນນັ້ນ. ຄິວປະສານງານທຣິດໃນຂະບວນການນີ້ ບໍ່ແມ່ນຜູ້ເຮັດວຽກໃນເຄື່ອງອື່ນ.

ບົດຄວາມທີ່ກ່ຽວຂ້ອງ