고정 풀이라면 라운드 로빈 선택은 놀랍도록 짧게 작성할 수 있습니다.

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))이지만 앞에서 제거하면 나머지 목록 요소가 밀립니다.

이 이터레이터의 역할은 의도적으로 소박합니다. 가용성을 확인하지 않고, 실패한 항목을 제거하지 않으며, 다른 외부 출구를 보장하지도 않습니다. 여러 엔드포인트가 하나의 외부 주소를 공유할 수 있습니다.

재시도 정책과 풀 갱신은 이 작은 선택기 바깥에 두세요. 공유 이터레이터에는 동시성 코드에서의 의도적인 소유 모델도 필요하며, 그래야 선택된 엔드포인트가 그것을 받은 작업에 계속 묶여 있습니다.

관련 글