სამუშაო პულის შექმნა არ აძლევს გამომძახებელს ჩამოტვირთულ გვერდებს. შეინახეთ და მოიხმარეთ გაგზავნილი სამუშაოს მიერ დაბრუნებული მნიშვნელობები:

from concurrent.futures import ThreadPoolExecutor
import urllib3

manager = urllib3.ProxyManager(
    'http://proxy.example:8080',
    maxsize=4,
    block=True,
)

def fetch(url):
    response = manager.request(
        'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
    )
    return url, response.status, response.data

try:
    with ThreadPoolExecutor(max_workers=4) as workers:
        results = list(workers.map(fetch, urls))
finally:
    manager.clear()

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

კონფიგურირებული ProxyManager ფლობს მოთხოვნების კავშირების პულს. აქ გამოყენებული ნაგულისხმევი წინასწარ ჩატვირთული პასუხის რეჟიმით urllib3 კითხულობს სხეულს და აბრუნებს კავშირს თავის პულში. ნაკადურ ვერსიას დასჭირდება მკაფიო მოხმარება და კავშირის გათავისუფლება.

maxsize ჩვეულებრივ აკონტროლებს შენახულ ხელახლა გამოსაყენებელ კავშირებს და არა მყარ ზღვარს ყოველ გახსნილ სოკეტზე. block=True ცვლის შესაბამისი პულის ქცევას, რათა გამომძახებლები დაელოდონ თავისუფალ კავშირს, ნაცვლად იმისა, რომ გახსნან დამატებითი ამ პულის ლიმიტს ზემოთ.

სამუშაოების რაოდენობა ამ მაგალითში ზღუდავს ერთდროულ გამოძახებებს. ბევრი დანიშნულების შემთხვევაში მნიშვნელოვანია პულის განლაგებაც და HTTPS გვირაბებისთვის გამოყენებული მარშრუტიც; ერთი პულის პარამეტრი არ უნდა აღიწეროს როგორც ერთი გლობალური სოკეტის კვოტა ყოველი ჰოსტისთვის.

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