Eşzamanlı urllib3 proxy isteklerinden her sonucu toplayın
Yapılandırılmış bir ProxyManager'ı çalışan iş parçacıkları arasında paylaşın, yürütücünün sonuç yineleyicisini tüketin ve havuz tutmayı bir bağlantı sınırından ayırın.
Bir çalışan havuzu oluşturmak, çağırana indirilen sayfaları vermez. Gönderilen işin döndürdüğü değerleri saklayın ve tüketin:
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()Bu bölüm sınırlı bir URL listesi ve olağan yanıt boyutları varsayar. Proxy kimlik doğrulaması olmadan izin verilen genel URL kontrolleri için HTTP proxy listesinden bir aday, yöneticinin örnek HTTP uç noktasını değiştirebilir. Her sonuç kendi URL'sini içerir, böylece çağıran durumu ve gövdeyi doğru istekle ilişkilendirebilir. map sonuçları giriş sırasına göre döndürür; bir çalışanda oluşan istisna, o sonuç alındığında yükseltilir.
Yapılandırılmış ProxyManager, istekler için bağlantı havuzuna sahiptir. Burada kullanılan varsayılan önceden yüklenmiş yanıt moduyla urllib3 gövdeyi okur ve bağlantıyı havuzuna geri verir. Akış sürümü açık tüketim ve bağlantının serbest bırakılmasını gerektirir.
maxsize normalde tutulan yeniden kullanılabilir bağlantıları denetler, açılan her soket için katı bir üst sınır değildir. block=True ilgili havuz davranışını değiştirir, böylece çağıranlar o havuzun sınırının üzerinde ek bağlantı açmak yerine boş bir bağlantı bekler.
Bu örnekte çalışan sayısı eşzamanlı çağrıları sınırlar. Çok sayıda hedef olduğunda havuz düzeni ve HTTPS tünelleri için kullanılan yol da önemlidir; tek bir havuz ayarı her ana bilgisayar için tek bir küresel soket kotası olarak tanımlanmamalıdır.