Hər Python ThreadPoolExecutor işinə URL və proksi təyin edin
Python sorğu işini göndərməzdən əvvəl proksi təyin edin, işçilərin paylaşılan dəyişən seçim vəziyyəti üzərində yarışmasına imkan verməyin.
Hovuzun map funksiyası hər dəfə işçiyə bir element ötürür. Həmin elementi tam bir işə çevirin, URL və seçilmiş proksi daxil olmaqla, belə ki işçi marşrutunu dəyişən qlobal siyahıdan çıxarmasın.
Məhdud urls üçün təsdiqlənmiş proksi URL-lərinin boş olmayan siyahısını verin. İctimai HTTP namizədləri HTTP proksi siyahısı səhifəsində mövcuddur:
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 və handle_result tətbiq tərəfindən verilir. Koordinator son nöqtələri təkrarlanan sıra ilə təyin edir; hər işçi bir sabit cüt alır. Nəticələri təkrar etmək işçi istisnalarını da üzə çıxarır.
Beş işçi aktiv işləri məhdudlaşdırır, proksi başına aktiv işləri yox. Siyahıda iki son nöqtə varsa, bir neçə iş eyni son nöqtəni eyni vaxtda istifadə edə bilər. Lazım olduqda hər son nöqtə üçün ayrıca tutum qaydası əlavə edin. Hər son nöqtə URL-i üçün bir aktiv iş üçün sinxronlaşdırılmış növbə icarəsi hər girişi qoruya və qaytara bilər.
Yenidən cəhd eyni URL üçün yeni məhdud cəhd yaratmalıdır. Paylaşılan siyahıdan girişləri silən rekursiv yenidən cəhd çağırışlarından çəkinin: başqa bir işçi ondan seçim edə bilər və tükənmiş siyahı yenə də açıq nəticə tələb edir.