【发布时间】:2017-06-21 13:59:08
【问题描述】:
我目前正在运行一个脚本,该脚本在很长一段时间内访问 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;
}
【问题讨论】:
-
我认为 429 来自某个时间单位的请求计数,所以也许您没有并行 40 多个请求,但在 1 秒内您会生成更多请求。请添加一些衡量 1 个请求的处理时间或询问服务器管理员的限制是多少。无论如何,如果您想遵守这样的限制(即每秒最多 40 个请求)或者您需要减少并行度,则必须重新编写此代码。
-
来自搜索的人:考虑这个问题的答案中的方法:.net Core Parallel.ForEach issues。这不是完全相同的问题,但this answer 有一些很好的建议。
标签: c# asp.net asp.net-web-api webrequest parallel.foreach