HttpClient 中有多少个连接

Jer*_*der 6 c# dotnet-httpclient

背景

我必须从互联网上下载大约 16k 个文档和相同数量的 html 页面。这个数字在未来还会增加。目前我只是Parallel.ForEach用来并行下载和处理数据。然而,这似乎并没有充分利用我的资源,所以我计划async/await发挥作用,尽可能多地异步运行下载,但我可能不得不限制它。

实际问题

单个可以有多少个打开的连接HttpClient?在创建如此大量的连接时,我还必须记住哪些其他因素?我知道我应该重用它HttpClient,我也阅读了这个答案,但我怀疑我是否真的可以同时打开数十亿个连接。

Tod*_*ier 8

首先,很好地呼吁从 切换Parallel.ForEachasync/await。通过打破线程的限制,您将能够将并发性提高几个数量级。

我怀疑我真的可以同时打开数十亿个连接。

假设你可以。你认为这项工作会比你一次打开 1000 个工作更快吗?您首先要遇到的限制是带宽(或者可能是服务器拒绝请求),而不是并发连接。因此,如果您的目标是尽快完成工作,我建议您一次可能打开的最大连接数甚至无关紧要。

也就是说,.NET 存在默认限制。假设您使用的是完整框架或 .NET Core 2.x,可以通过编程方式更改限制ServicePointManager.DefaultConnectionLimit,其默认值仅为 2。将其设置为更大的值。

接下来,我建议您使用SemaphoreSlimTPL Dataflow 或 TPL Dataflow设置您的代码以在达到某个限制的情况下同时执行下载。这两种方法都在这个问题的答案中得到了很好的介绍。然后开始试验,直到你想出一个最佳数字。很难说那是什么。也许从 50 开始。如果进展顺利,将其增加到 100,看看整个工作是否完成得更快。如果您开始收到从服务器返回的套接字异常或错误,请将其拨下来。

  • @mr5 该链接涵盖了默认连接限制,我也涵盖了该限制,并且根本没有回答实际可能有多少连接的问题。您可以取消限制,但您仍然受到其他因素的约束,正如我已经解释的那样。没有一个适用于所有情况的硬性数字,如果您发现这个事实不令人满意,我很抱歉。 (4认同)
  • 给以后阅读本文的人的简短说明:切换到 `async` 时要小心。显然,这可以**大大**更快,并且可能会让您被外部端点阻止。 (2认同)