ແບ່ງປັນພູລພຣັອກຊີລະຫວ່າງທຣິດ Python ດ້ວຍຄິວ
ໃຊ້ຄິວທີ່ຊິງຄຣອນໄນສ໌ ແລະ ບລັອກ finally ເພື່ອຈອງພຣັອກຊີໜຶ່ງສຳລັບການເຮັດວຽກແບບທຣິດຊິງຄຣອນັສ ແລ້ວສົ່ງຄືນພາຍຫຼັງ.
ເມື່ອຫຼາຍທຣິດແບ່ງປັນພູລພຣັອກຊີນ້ອຍໜຶ່ງ, ການເລືອກລາຍການແບບສຸ່ມອາດເຮັດໃຫ້ສອງການເຮັດວຽກທີ່ກຳລັງເຮັດຢູ່ໄດ້ພຣັອກຊີດຽວກັນ. ຄິວສາມາດເກັບລາຍການທີ່ມີຢູ່ສຳລັບການຢືມໃນຕອນນີ້:
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 ທີ່ແຕກຕ່າງກັນຍັງສາມາດອ້າງອີງພຣັອກຊີທາງກາຍະພາບດຽວກັນ ຫຼື ທາງອອກ; ຈັດກຸ່ມພວກມັນຢ່າງຕັ້ງໃຈ ຖ້າຄວາມພິເສດຕ້ອງນຳໃຊ້ກັບຊັບພະຍາກອນທີ່ແບ່ງປັນນັ້ນ. ຄິວປະສານງານທຣິດໃນຂະບວນການນີ້ ບໍ່ແມ່ນຜູ້ເຮັດວຽກໃນເຄື່ອງອື່ນ.