Parallel.foreach() 与 WebRequest。 429错误
Parallel.foreach() with WebRequest. 429 error
我目前是 运行 一个脚本,在很长一段时间内点击 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;
}
正如 smartobelix 指出的那样,将并行度设置为 5 不会阻止您发送服务器端策略定义的过多请求。它所做的只是防止您耗尽在您这边发出这些请求所需的线程数。所以您需要做的是与服务器所有者沟通,熟悉他们的限制并更改您的代码以永不满足限制。
涉及的变量有:
- 您将发送的并发请求数(并行度)
- 一个请求的平均时间
- 服务器允许的单位时间内的最大请求数
因此,例如,如果您的平均请求时间为 200 毫秒并且最大并行度为 5,那么平均每秒可以发送 25 个请求。如果每个请求需要 500 毫秒,那么您将只发送 10 个。
将服务器允许的数字混入其中,您将了解如何微调您的数字。
以上两个答案基本正确。我遇到的问题是服务器管理员设置了 100 requests/min 的速率限制,而以前没有并且没有通知我。一旦达到 100 requests/min 这个限制,我几乎立即开始收到 429 个错误,并开始以同样收到 429 个错误的速度发出请求。
我目前是 运行 一个脚本,在很长一段时间内点击 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;
}
正如 smartobelix 指出的那样,将并行度设置为 5 不会阻止您发送服务器端策略定义的过多请求。它所做的只是防止您耗尽在您这边发出这些请求所需的线程数。所以您需要做的是与服务器所有者沟通,熟悉他们的限制并更改您的代码以永不满足限制。
涉及的变量有:
- 您将发送的并发请求数(并行度)
- 一个请求的平均时间
- 服务器允许的单位时间内的最大请求数
因此,例如,如果您的平均请求时间为 200 毫秒并且最大并行度为 5,那么平均每秒可以发送 25 个请求。如果每个请求需要 500 毫秒,那么您将只发送 10 个。
将服务器允许的数字混入其中,您将了解如何微调您的数字。
以上两个答案基本正确。我遇到的问题是服务器管理员设置了 100 requests/min 的速率限制,而以前没有并且没有通知我。一旦达到 100 requests/min 这个限制,我几乎立即开始收到 429 个错误,并开始以同样收到 429 个错误的速度发出请求。