Para um conjunto fixo, a seleção round-robin pode ser agradavelmente curta:

from itertools import cycle

choices = cycle([
    "http://proxy-a.example:8080",
    "http://proxy-b.example:8080",
    "http://proxy-c.example:8080",
])

endpoint = next(choices)

Substitua os URL de exemplo por endpoints HTTP do seu serviço ou da lista de proxies HTTP. Chamadas sucessivas retornam A, B, C e depois A novamente. Use o valor selecionado ao configurar a requisição seguinte. Recriar o iterador a cada requisição reiniciaria a sequência. Com Requests, passe o endpoint selecionado para a requisição.

Se preferir uma lista, mova o primeiro item dela para o fim. pool.append(pool.pop()) remove o último item e o devolve logo em seguida; o primeiro item nunca muda. A operação de fila é pool.append(pool.pop(0)), embora remover da frente desloque os itens restantes da lista.

O iterador tem uma tarefa deliberadamente modesta. Não verifica disponibilidade, não remove entradas com falha nem garante uma saída pública diferente. Vários endpoints podem compartilhar um mesmo endereço externo.

Mantenha a política de novas tentativas e as atualizações do conjunto fora deste pequeno seletor. Um iterador compartilhado também precisa de um modelo de posse intencional em código concorrente, para que o endpoint escolhido continue ligado à operação que o recebeu.

Artigos relacionados