Bagikan kumpulan proxy antar-thread Python dengan antrean
Gunakan antrean tersinkronisasi dan blok finally untuk memesan satu proxy bagi operasi thread sinkron dan mengembalikannya setelahnya.
Ketika beberapa thread berbagi kumpulan proxy kecil, memilih entri secara acak dapat memberi dua operasi aktif proxy yang sama. Antrean dapat menampung entri yang saat ini tersedia untuk dipinjam:
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)
Bangun antrean sekali, sebelum memulai thread pekerja. proxy_urls berisi URL titik akhir lengkap. Kandidat publik tersedia di daftar proxy gratis; gunakan protokol dan format URL yang didukung fetch_one. Fungsi fetch_one sinkron yang ada harus menyelesaikan operasi jaringannya dan menutup respons apa pun sebelum kembali. Jika tidak, peminjaman akan berakhir saat koneksi masih memakai proxy itu.
Queue.get menghapus satu entri yang tersedia secara atomik. Kumpulan yang habis menunggu alih-alih berulang kali memindai flag bersama. Jika tidak ada entri yang datang dalam lima detik, queue.Empty sampai ke pemanggil; pilih kebijakan percobaan ulang, kegagalan, atau pembatalan aplikasi untuk hasil itu.
Blok finally mengembalikan entri yang diperoleh setelah keberhasilan atau pengecualian. Blok ini tidak menyatakan bahwa titik akhir yang gagal sehat. Kebijakan karantina, penggantian, dan pendinginan memerlukan jalur eksplisit alih-alih diam-diam membuang setiap proxy yang melihat kesalahan sementara.
Menghapus duplikat string URL identik mencegah entri antrean ganda. URL berbeda masih dapat merujuk ke proxy fisik yang sama atau keluar; kelompokkan dengan sengaja jika eksklusivitas harus berlaku pada sumber daya bersama itu. Antrean mengoordinasikan thread dalam proses ini, bukan pekerja di mesin lain.