პულის map მუშას ერთ ნივთს გადასცემს ერთდროულად. აქციეთ ეს ნივთი სრულ დავალებად, URL-ისა და არჩეული პროქსის ჩათვლით, რათა მუშამ თავისი მარშრუტი ცვალებადი გლობალური სიიდან არ გამოიტანოს.

სასრული urls-ისთვის მიუთითეთ დამოწმებული პროქსი URL-ების არაცარიელი სია. საჯარო HTTP კანდიდატები ხელმისაწვდომია 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 და handle_result აპლიკაციის მიერ მოწოდებულია. კოორდინატორი საბოლოო წერტილებს განმეორებადი თანმიმდევრობით ანიჭებს; თითოეული მუშა ერთ ფიქსირებულ წყვილს იღებს. შედეგების გამეორება მუშების გამონაკლისებსაც ამხელს.

ხუთი მუშა ზღუდავს აქტიურ დავალებებს და არა აქტიურ დავალებებს პროქსიზე. თუ სიაში ორი საბოლოო წერტილია, რამდენიმე დავალებას შეუძლია ერთი და იმავე წერტილის ერთდროულად გამოყენება. საჭიროების შემთხვევაში დაამატეთ ცალკე ტევადობის წესი თითოეული წერტილისთვის. ერთი აქტიური დავალებისთვის საბოლოო წერტილის URL-ზე, სინქრონიზებული რიგის იჯარა-ს შეუძლია ყოველი ჩანაწერის დაჯავშნა და დაბრუნება.

გამეორებულმა მცდელობამ უნდა შექმნას ახალი შემოსაზღვრული მცდელობა იმავე URL-ისთვის. მოერიდეთ რეკურსიულ გამეორებულ გამოძახილებს, რომლებიც ერთობლივი სიიდან ჩანაწერებს შლიან: სხვა მუშა შეიძლება იქიდან ირჩევდეს და ამოწურულ სიას კვლავ ცხადი შედეგი სჭირდება.

დაკავშირებული სტატიები