Hovuzning map funksiyasi ishchiga bir vaqtda bitta element beradi. O'sha elementni URL va tanlangan proksini o'z ichiga olgan to'liq ishga aylantiring, shunda ishchi o'z yo'nalishini o'zgaruvchan global ro'yxatdan taxmin qilmaydi.

Cheklangan urls uchun tekshirilgan proksi URL larining bo'sh bo'lmagan ro'yxatini bering. Ommaviy HTTP nomzodlari HTTP proksi ro'yxatida da mavjud:

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 va handle_result ilova tomonidan taqdim etiladi. Koordinator oxirgi nuqtalarni takrorlanuvchi tartibda tayinlaydi; har bir ishchi bitta qat'iy juftlik oladi. Natijalarni takrorlash ishchilarning istisnolarini ham ochib beradi.

Beshta ishchi faol ishlarni cheklaydi, proksi boshiga faol ishlarni emas. Agar ro'yxatda ikkita oxirgi nuqta bo'lsa, bir nechta ish bir vaqtda bir xil nuqtadan foydalanishi mumkin. Zarur bo'lganda har bir oxirgi nuqta uchun alohida sig'im qoidasini qo'shing. Har bir oxirgi nuqta URL si uchun bitta faol ish uchun sinxronlangan navbat ijarasi har bir yozuvni band qilib qaytarishi mumkin.

Qayta urinish xuddi shu URL uchun yangi cheklangan urinish yaratishi kerak. Umumiy ro'yxatdan yozuvlarni olib tashlaydigan rekursiv qayta urinish chaqiruvlaridan saqlaning: boshqa ishchi undan tanlayotgan bo'lishi mumkin va tugagan ro'yxat hamon aniq natijani talab qiladi.

O'xshash maqolalar