Apabila beberapa benang berkongsi kumpulan proksi kecil, memilih entri secara rawak boleh memberikan proksi yang sama kepada dua operasi aktif. Baris gilir boleh menyimpan entri yang tersedia untuk dipinjam pada masa ini:

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)

Bina baris gilir sekali, sebelum memulakan benang pekerja. proxy_urls mengandungi URL titik akhir penuh. Calon awam tersedia dalam senarai proksi percuma; gunakan protokol dan format URL yang disokong fetch_one. Fungsi fetch_one segerak sedia ada mesti menamatkan operasi rangkaiannya dan menutup sebarang respons sebelum kembali. Jika tidak, pinjaman akan tamat semasa sambungan masih menggunakan proksi itu.

Queue.get membuang satu entri tersedia secara atomik. Kumpulan yang habis menunggu dan bukannya berulang kali mengimbas bendera kongsi. Jika tiada entri tiba dalam lima saat, queue.Empty sampai kepada pemanggil; pilih dasar cuba semula, kegagalan atau pembatalan aplikasi untuk hasil itu.

Blok finally mengembalikan entri yang diperoleh selepas kejayaan atau pengecualian. Ia tidak mengisytiharkan bahawa titik akhir yang gagal itu sihat. Dasar kuarantin, penggantian dan penyejukan memerlukan laluan eksplisit dan bukannya membuang secara senyap setiap proksi yang melihat ralat sementara.

Menyahgandakan rentetan URL yang sama menghalang entri baris gilir berganda. URL berbeza masih boleh merujuk kepada proksi fizikal yang sama atau keluar; kumpulkan mereka secara sengaja jika eksklusiviti mesti terpakai pada sumber kongsi itu. Baris gilir menyelaraskan benang dalam proses ini, bukan pekerja pada mesin lain.

Artikel berkaitan