itertools.cycle을 사용한 Python의 라운드 로빈 프록시 선택
고정 풀에서 예측 가능한 프록시 선택을 위해 반복 이터레이터를 사용하고, 선택을 요청 실행 및 상태 점검과 분리해 두세요.
고정 풀이라면 라운드 로빈 선택은 놀랍도록 짧게 작성할 수 있습니다.
from itertools import cycle
choices = cycle([
"http://proxy-a.example:8080",
"http://proxy-b.example:8080",
"http://proxy-c.example:8080",
])
endpoint = next(choices)
예시 URL은 서비스나 HTTP 프록시 목록에 있는 HTTP 엔드포인트로 바꾸세요. 연속 호출은 A, B, C를 반환하고 다시 A로 돌아갑니다. 선택한 값은 이어지는 요청을 설정할 때 사용합니다. 요청마다 이터레이터를 다시 만들면 순서가 처음부터 다시 시작됩니다. Requests에서는 선택한 엔드포인트를 요청에 넘기세요.
목록을 선호한다면 첫 항목을 뒤로 옮기세요. pool.append(pool.pop())은 마지막 항목을 꺼내 곧바로 되돌려 놓으므로 첫 항목은 절대 바뀌지 않습니다. 큐 연산은 pool.append(pool.pop(0))이지만 앞에서 제거하면 나머지 목록 요소가 밀립니다.
이 이터레이터의 역할은 의도적으로 소박합니다. 가용성을 확인하지 않고, 실패한 항목을 제거하지 않으며, 다른 외부 출구를 보장하지도 않습니다. 여러 엔드포인트가 하나의 외부 주소를 공유할 수 있습니다.
재시도 정책과 풀 갱신은 이 작은 선택기 바깥에 두세요. 공유 이터레이터에는 동시성 코드에서의 의도적인 소유 모델도 필요하며, 그래야 선택된 엔드포인트가 그것을 받은 작업에 계속 묶여 있습니다.