以受限并发检查代理列表
为并发代理检查设定上限,并记录每次检查对目标网站究竟确认了什么。
var options = new ParallelOptions
{
MaxDegreeOfParallelism = 8,
CancellationToken = cancellationToken
};
await Parallel.ForEachAsync(endpoints, options,
async (endpoint, token) =>
{
var result = await ProbeAsync(endpoint, target, token);
observations.Add(result);
});使用有界的工作者池,而不是为每个端点各起一个任务。针对获准的公共目标做检查时,免费代理列表提供候选行;构造探测时保留每条记录的协议。这段 .NET 调度片段假定 ProbeAsync 能感知代理,且 observations 收集器是线程安全的。八只是一个示例上限,并非实测出的最优值。探测仍然需要每次尝试的时限和整个作业的取消。
即使完成顺序不同,也要把每个已完成的结果和它的输入放在一起。记录协议、端点、目标、方法、耗时和结果。连接失败、代理登录被拒、CONNECT 被拒绝,以及收到网站响应,是几种不同的观测。
TCP 端口打开并不能证明代理协商成功。把代理地址当作网站抓取,同样不同于用它请求目标。
按所需能力选择目标和方法。HEAD 能省下正文流量,却不能证明 GET 会返回有用内容;网站可能拒绝其中一种而允许另一种。HTTPS 增加了明文 HTTP 没有的 CONNECT 和目标端 TLS。出口地址属于目标侧的另一项观测,与配置的入口是两回事。
有界作业让检查器不至于在评估线路之前先耗尽自己的套接字、内存或调度器。分阶段的结果对选择策略依然有用,同时不必假装某一个成功的目标就能让该端点放之四海皆准。