Jer*_*der 6 c# dotnet-httpclient
我必须从互联网上下载大约 16k 个文档和相同数量的 html 页面。这个数字在未来还会增加。目前我只是Parallel.ForEach用来并行下载和处理数据。然而,这似乎并没有充分利用我的资源,所以我计划async/await发挥作用,尽可能多地异步运行下载,但我可能不得不限制它。
单个可以有多少个打开的连接HttpClient?在创建如此大量的连接时,我还必须记住哪些其他因素?我知道我应该重用它HttpClient,我也阅读了这个答案,但我怀疑我是否真的可以同时打开数十亿个连接。
首先,很好地呼吁从 切换Parallel.ForEach到async/await。通过打破线程的限制,您将能够将并发性提高几个数量级。
我怀疑我真的可以同时打开数十亿个连接。
假设你可以。你认为这项工作会比你一次打开 1000 个工作更快吗?您首先要遇到的限制是带宽(或者可能是服务器拒绝请求),而不是并发连接。因此,如果您的目标是尽快完成工作,我建议您一次可能打开的最大连接数甚至无关紧要。
也就是说,.NET 存在默认限制。假设您使用的是完整框架或 .NET Core 2.x,可以通过编程方式更改限制ServicePointManager.DefaultConnectionLimit,其默认值仅为 2。将其设置为更大的值。
接下来,我建议您使用SemaphoreSlimTPL Dataflow 或 TPL Dataflow设置您的代码以在达到某个限制的情况下同时执行下载。这两种方法都在这个问题的答案中得到了很好的介绍。然后开始试验,直到你想出一个最佳数字。很难说那是什么。也许从 50 开始。如果进展顺利,将其增加到 100,看看整个工作是否完成得更快。如果您开始收到从服务器返回的套接字异常或错误,请将其拨下来。