جمعآوری هر نتیجه از درخواستهای همزمان پروکسی urllib3
یک ProxyManager پیکربندیشده را میان رشتههای کارگر به اشتراک بگذارید، تکراگردندهٔ نتایج اجراکننده را مصرف کنید و نگهداشت مخزن را از محدودیت اتصال جدا کنید.
ساختن مخزن کارگران، صفحههای دانلودشده را به فراخواننده نمیدهد. مقادیری را که کار ارسالشده برمیگرداند نگه دارید و مصرف کنید:
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 نیز مهم است؛ تنظیم یک مخزن را نباید سهمیهٔ سراسری سوکت برای هر میزبان توصیف کرد.