Tetapkan URL dan proxy untuk setiap tugas Python ThreadPoolExecutor
Tetapkan proxy sebelum mengirim tugas permintaan Python, alih-alih membiarkan pekerja berlomba atas status pemilihan bersama yang dapat berubah.
map sebuah pool meneruskan satu item kepada pekerja pada satu waktu. Jadikan item itu tugas lengkap, termasuk URL dan proxy yang dipilih, agar pekerja tidak menyimpulkan rutenya dari daftar global yang berubah.
Untuk urls yang terbatas, sediakan daftar URL proxy tervalidasi yang tidak kosong. Kandidat HTTP publik tersedia di daftar proxy 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. Koordinator menetapkan titik akhir dalam urutan berulang; setiap pekerja menerima satu pasangan tetap. Mengiterasi hasilnya juga memunculkan pengecualian pekerja.
Lima pekerja membatasi tugas aktif, bukan tugas aktif per proxy. Jika daftar berisi dua titik akhir, beberapa tugas dapat menggunakan titik akhir yang sama secara bersamaan. Tambahkan aturan kapasitas terpisah per titik akhir bila diperlukan. Untuk satu tugas aktif per URL titik akhir, sewa antrean tersinkronisasi dapat memesan dan mengembalikan setiap entri.
Percobaan ulang harus membuat percobaan terbatas baru untuk URL yang sama. Hindari panggilan percobaan ulang rekursif yang menghapus entri dari daftar bersama: pekerja lain mungkin sedang memilih darinya, dan daftar yang habis tetap memerlukan hasil yang eksplisit.