对于固定池,轮询选择可以写得相当短小:

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)),不过从头部移除会移动列表中其余的元素。

这个迭代器的职责有意保持很小。它不检查可用性、不移除失败的条目,也不保证得到不同的公网出口。多个端点可能共用同一个对外地址。

把重试策略和池更新留在这个小型选择器之外。共享迭代器还需要 并发代码中有意的归属模型,这样选中的端点才会始终绑定到接收它的操作上。

相关文章