יצירת מאגר עובדים אינה מספקת לקורא את הדפים שהורדו. שמרו וצרכו את הערכים שהעבודה שנשלחה מחזירה:

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 יכול להחליף את נקודת הקצה לדוגמה של המנהל. כל תוצאה כוללת את ה-URL שלה כדי שהקורא יוכל לשייך סטטוס וגוף לבקשה הנכונה. map מחזיר תוצאות לפי סדר הקלט; חריגה בעובד מועלית כאשר אותה תוצאה נשלפת.

ה-ProxyManager המוגדר מחזיק את מאגר החיבורים לבקשות. עם מצב התגובה הנטען מראש המוגדר כברירת מחדל המשמש כאן, urllib3 קורא את הגוף ומחזיר את החיבור למאגר שלו. גרסת זרימה תזדקק לצריכה מפורשת ולשחרור החיבור.

maxsize שולט בדרך כלל בחיבורים לשימוש חוזר שנשמרים, ולא במגבלה קשיחה על כל socket פתוח. block=True משנה את התנהגות המאגר הרלוונטית כך שקריאות ממתינות לחיבור פנוי במקום לפתוח נוספים מעבר למגבלת אותו מאגר.

מספר העובדים מגביל קריאות במקביל בדוגמה זו. עם יעדים רבים, גם פריסת המאגר והמסלול המשמש למנהרות HTTPS חשובים; אין לתאר הגדרה של מאגר אחד כמכסת sockets גלובלית אחת לכל מארח.

מאמרים קשורים