我目前正在运行一个脚本,该脚本在一段较长的时间内访问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;
}发布于 2017-06-21 16:49:27
正如智能信徒所指出的,将并行度设置为5并不会阻止您发送服务器端策略定义的太多请求。它所做的就是防止您耗尽在您这边进行这些请求所需的线程数。因此,您需要做的是与服务器所有者沟通,熟悉它们的限制,并更改代码,使其永远不满足限制。
所涉及的变量如下:
因此,例如,如果您的平均请求时间是200 is,并且最大并行度为5,那么您可以期望平均每秒发送25个请求。如果每个请求需要500 10,那么您只需发送10条。
混合服务器允许数字进入,您将得到如何微调您的数字的想法。
发布于 2017-06-22 11:56:42
以上两个答案基本上都是正确的。我遇到的问题是,服务器管理器在以前没有请求的情况下,设置了100个请求/分钟的速率限制,并且没有通知我。当我达到100次请求/分钟的极限时,我几乎立即收到了429个错误,并开始以这个速度发送请求,同时也收到了429个错误。
https://stackoverflow.com/questions/44678270
复制相似问题