إنشاء تجمع عمال لا يمنح المستدعي الصفحات التي تم تنزيلها. احتفظ بالقيم التي يعيدها العمل المُرسَل واستهلكها:

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؛ فلا ينبغي وصف إعداد تجمع واحد بأنه حصة مقابس عالمية واحدة لكل مضيف.

مقالات ذات صلة