워커 풀을 만든다고 해서 호출자에게 다운로드된 페이지가 전달되지는 않습니다. 제출된 작업이 반환하는 값을 보관하고 소비하십시오:

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 터널에 사용되는 경로도 중요합니다. 하나의 풀 설정을 모든 호스트에 대한 단일 전역 소켓 할당량으로 설명해서는 안 됩니다.

관련 글