Berikan URL dan proksi kepada setiap tugas Python ThreadPoolExecutor
Berikan proksi sebelum menyerahkan tugas permintaan Python daripada membiarkan pekerja bersaing untuk keadaan pemilihan kongsi yang boleh berubah.
map sesuatu kolam menyerahkan satu item kepada pekerja pada satu masa. Jadikan item itu tugas lengkap, termasuk URL dan proksi yang dipilih, supaya pekerja tidak menyimpulkan laluannya daripada senarai global yang berubah.
Untuk urls terhingga, sediakan senarai URL proksi yang disahkan dan tidak kosong. Calon HTTP awam tersedia dalam senarai proksi HTTP:
from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests
def fetch(job):
url, proxy_url = job
proxies = {"http": proxy_url, "https": proxy_url}
with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
response.raise_for_status()
return url, response.text
if not proxy_urls:
raise ValueError("No proxy endpoints were supplied")
jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
for url, body in executor.map(fetch, jobs):
handle_result(url, body)urls, proxy_urls dan handle_result disediakan oleh aplikasi. Penyelaras memberikan titik akhir dalam susunan berulang; setiap pekerja menerima satu pasangan tetap. Lelaran hasil juga mendedahkan pengecualian pekerja.
Lima pekerja mengehadkan tugas aktif, bukan tugas aktif bagi setiap proksi. Jika senarai mempunyai dua titik akhir, beberapa tugas boleh menggunakan titik akhir yang sama secara serentak. Tambah peraturan kapasiti berasingan bagi setiap titik akhir apabila perlu. Untuk satu tugas aktif bagi setiap URL titik akhir, pajakan baris gilir disegerakkan boleh menempah dan memulangkan setiap entri.
Cubaan semula harus mencipta cubaan terbatas baharu untuk URL yang sama. Elakkan panggilan cubaan semula rekursif yang mengeluarkan entri daripada senarai kongsi: pekerja lain mungkin sedang memilih daripadanya, dan senarai yang habis masih memerlukan hasil yang jelas.