Membuat pool pekerja tidak memberikan halaman yang diunduh kepada pemanggil. Simpan dan konsumsi nilai yang dikembalikan oleh pekerjaan yang dikirim:

from concurrent.futures import ThreadPoolExecutor
import urllib3

manager = urllib3.ProxyManager(
    'http://proxy.example:8080',
    maxsize=4,
    block=True,
)

def fetch(url):
    response = manager.request(
        'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
    )
    return url, response.status, response.data

try:
    with ThreadPoolExecutor(max_workers=4) as workers:
        results = list(workers.map(fetch, urls))
finally:
    manager.clear()

Fragmen ini mengasumsikan daftar URL yang terbatas dan ukuran respons biasa. Untuk pemeriksaan URL publik yang diizinkan tanpa autentikasi proxy, kandidat dari daftar proxy HTTP dapat menggantikan endpoint HTTP contoh pengelola. Setiap hasil menyertakan URL-nya sehingga pemanggil dapat mengaitkan status dan isi dengan permintaan yang benar. map mengembalikan hasil dalam urutan masukan; pengecualian di pekerja dimunculkan saat hasil itu diambil.

ProxyManager yang dikonfigurasi memiliki pooling koneksi untuk permintaan. Dengan mode respons pramuat bawaan yang digunakan di sini, urllib3 membaca isi dan mengembalikan koneksi ke pool-nya. Versi streaming akan memerlukan konsumsi eksplisit dan pelepasan koneksi.

maxsize biasanya mengontrol koneksi yang dapat digunakan kembali dan dipertahankan, bukan batas keras pada setiap soket yang dibuka. block=True mengubah perilaku pool yang relevan sehingga pemanggil menunggu koneksi bebas alih-alih membuka koneksi tambahan di atas batas pool tersebut.

Jumlah pekerja membatasi panggilan bersamaan dalam contoh ini. Dengan banyak tujuan, tata letak pool dan rute yang digunakan untuk terowongan HTTPS juga penting; pengaturan per pool tidak boleh digambarkan sebagai satu kuota soket global untuk setiap host.

Artikel terkait