c# - 使用“刻录”CPU 进行 httpwebrequest
问题描述
我想运行大约 10,000 个并发请求,使用 .net HttpWebRequest,并不是所有的请求都去同一个主机,其中一些通过代理池。
我目前正在使用线程,它可以在最多 1000 个并发时正常工作,但是我的 CPU 负载为 100%。如何解决?
public string HttpGet(string url)
{
try {
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = 20000;
request.CookieContainer = Cookie;
request.AutomaticDecompression = DecompressionMethods.GZip;
request.KeepAlive = true;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string tmp = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();
return tmp;
} catch (Exception ex) {
return "";
}
}
我每次都发送请求,所以在 1 分钟内发出 1000 个请求。
解决方案
- 使用异步任务而不是线程。I/O 操作不需要线程来等待它们,但操作系统会花时间在它们之间切换。
- 即使请求失败,也可以使用
using
块而不是调用来正确处置资源。Close
- 不要忘记为并发请求设置正确的最大限制。
catch (Exception ex)
是一种反模式。
推荐阅读
- typescript - 使用Typescript的keyof获取对应类型?
- apache-spark - 我的大数据框架设置是否完整,还是我错过了一些重要的东西?
- ios - 如何在 iOS 13 中创建带有麦克风图标的搜索栏?
- r - 如何在 R 中编写循环?
- magento - 404 错误:找不到页面。(Magento 2 全新安装 ubuntu 18)
- google-app-engine - 本地环境中的 gcloud、python 3、app.yaml 没有
- c++ - 控制台顶部的永久时钟
- c - visual c ++ winSock 连接到vps,vds服务器,客户端和服务器等待连接,如何修复?
- python - TypeError: Column() 得到了一个意外的关键字参数“primary_key”
- python - 有没有办法为使用 parser.add_option 创建的选项输入输入,而不为同一选项输入任何输入?