Kumpul Setiap Hasil daripada Permintaan Proksi urllib3 Serentak
Kongsi ProxyManager yang dikonfigurasikan antara utas pekerja, gunakan iterator hasil pelaksana dan bezakan pengekalan kolam daripada had sambungan.
Mencipta kolam pekerja tidak memberikan halaman yang dimuat turun kepada pemanggil. Simpan dan gunakan nilai yang dikembalikan oleh kerja yang dihantar:
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()Serpihan ini menganggap senarai URL terhad dan saiz respons biasa. Untuk semakan URL awam yang dibenarkan tanpa pengesahan proksi, calon daripada senarai proksi HTTP boleh menggantikan titik akhir HTTP contoh pengurus. Setiap hasil menyertakan URLnya supaya pemanggil boleh mengaitkan status dan badan dengan permintaan yang betul. map mengembalikan hasil mengikut susunan input; pengecualian dalam pekerja dimunculkan apabila hasil itu diambil.
ProxyManager yang dikonfigurasikan memiliki pengumpulan sambungan untuk permintaan. Dengan mod respons pramuat lalai yang digunakan di sini, urllib3 membaca badan dan mengembalikan sambungan ke kolamnya. Versi penstriman memerlukan penggunaan eksplisit dan pelepasan sambungan.
maxsize biasanya mengawal sambungan boleh guna semula yang dikekalkan, bukan had keras pada setiap soket yang dibuka. block=True mengubah tingkah laku kolam berkenaan supaya pemanggil menunggu sambungan bebas dan bukannya membuka tambahan melebihi had kolam itu.
Bilangan pekerja mengehadkan panggilan serentak dalam contoh ini. Dengan banyak destinasi, susun atur kolam dan laluan yang digunakan untuk terowong HTTPS juga penting; tetapan setiap kolam tidak sepatutnya diterangkan sebagai satu kuota soket global untuk setiap hos.