For a fixed pool, round-robin selection can be pleasantly small:

from itertools import cycle

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

endpoint = next(choices)

Replace the sample URLs with HTTP endpoints from your service or the HTTP proxy list. Successive calls return A, B, C, then A again. Use the selected value when configuring the request that follows. Creating the iterator again for each request would restart the sequence. For Requests, pass the selected endpoint into the request.

If you prefer a list, move its front item to the back. pool.append(pool.pop()) removes the last item and puts it straight back; the first item never changes. The queue operation is pool.append(pool.pop(0)), though removing from the front shifts the remaining list elements.

The iterator has a deliberately modest job. It does not check availability, remove failed entries or guarantee a different public exit. Several endpoints can share one outward address.

Keep retry policy and pool updates outside this tiny selector. A shared iterator also needs an intentional ownership model in concurrent code so that the chosen endpoint stays attached to the operation that received it.

Tënë sô zo