用 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)),不过从头部移除会移动列表中其余的元素。
这个迭代器的职责有意保持很小。它不检查可用性、不移除失败的条目,也不保证得到不同的公网出口。多个端点可能共用同一个对外地址。
把重试策略和池更新留在这个小型选择器之外。共享迭代器还需要 并发代码中有意的归属模型,这样选中的端点才会始终绑定到接收它的操作上。