代理 B,又是代理 B,然后是代理 A。你的日志看起来可疑,但随机挑选器完全有权这样做。

每次请求都从同一列表中选择,就允许出现重复。当两个端点概率相同时,下一次独立挑选与上一次相同的概率是二分之一。一段包含重复的短序列,并不能证明挑选器忽略了列表。

选择你真正需要的行为

要求选择规则
每次挑选都独立每次都从合格列表中挑选
在重新开始前把每个端点用一次打乱一份副本,用完它,然后开始新一轮
避开紧邻的上一个端点挑选前排除那个端点

对于最后一种策略,要显式处理只有一个端点的情况:

candidates = [endpoint for endpoint in eligible if endpoint != previous]
if not candidates:
    raise RuntimeError("No different eligible proxy is available")
selected = random.choice(candidates)

这段代码假定已经导入了 random,并且端点列表已经过验证。当公共池的协议适合最终客户端时,可以从免费代理列表开始;这条选择规则仍然控制重复。是等待、复用唯一端点还是停止,属于应用策略。等待另一个随机值的死循环无法解决只含一个不同选项的列表。

在并发调度器中,挑选并记录上一个端点也需要协调所有权。否则两个工作进程可能都排除旧值,并选中同一个下一个值。

最后,这条规则关乎端点身份。两个不同的端点可能通向同一个公网出口,而一个提供方端点也可能通向多个出口。在判定轮换已损坏之前,要把这些分开记录。

相关文章