我目前正在运行一个脚本,该脚本在很长一段时间内大约会击打api大约3000次。我正在使用parallel.foreach(),以便我可以一次发送一些请求来加快进程。我在每个foreach迭代中创建了两个请求,所以我的请求不应超过10个。我的问题是我一直收到来自服务器的429个错误,并且我与管理服务器的人交谈,他们说他们正在看到40多个爆发的请求。根据我目前对我的代码的理解,我不相信这甚至是可能的,有人可以让我知道如果我在这里遗漏了什么吗?
public static List<Requests> GetData(List<Requests> requests)
{
ParallelOptions para = new ParallelOptions();
para.MaxDegreeOfParallelism = 5;
Parallel.ForEach(requests, para, request =>
{
WeatherAPI.GetResponseForDay(request);
});
return requests;
}
public static Request GetResponseForDay(Request request)
{
var request = WebRequest.Create(request);
request.Timeout = 3600000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader myStreamReader = new
StreamReader(response.GetResponseStream());
string responseData = myStreamReader.ReadToEnd();
response.Close();
var request2 WebRequest.Create(requestthesecond);
HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
StreamReader myStreamReader2 = new
StreamReader(response2.GetResponseStream());
string responseData2 = myStreamReader2.ReadToEnd();
response2.Close();
DoStuffWithData(responseData, responseData2)
return request;
}
答案 0 :(得分:1)
涉及的变量是:
因此,例如,如果您的平均请求时间是200毫秒,并且您的最大并行度为5,那么您平均每秒可以发送25个请求。如果每个请求需要500毫秒,那么你只会发送10个。
混合服务器允许数字进入,你就会明白如何微调数字。
答案 1 :(得分:1)
上述两个答案基本上都是正确的。我遇到的问题是服务器管理员设置了100个请求/分钟的速率限制,而以前没有一个,并且没有通知我。一旦达到100个请求/分钟的限制,我几乎立即开始接收429个错误,并开始以该速度发出请求,这也是收到429个错误。