在多线程环境中使用 HttpClient 的最佳实践

2023-11-21

一段时间以来,我一直在多线程环境中使用 HttpClient。对于每个线程,当它发起连接时,都会创建一个全新的 HttpClient 实例。

最近我发现,使用这种方法会导致用户打开的端口过多,并且大部分连接处于TIME_WAIT状态。

http://www.opensubscriber.com/message/[电子邮件受保护]/86045.html

因此,不是每个线程都执行以下操作:

HttpClient c = new HttpClient();
try {
    c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

我们计划:

[方法一]

// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());

try {
    global_c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

正常情况下,global_c将被50++个线程同时访问。我想知道,这会产生任何性能问题吗? MultiThreadedHttpConnectionManager是否使用无锁机制来实现其线程安全策略?

如果有10个线程使用global_c,其他40个线程会被锁定吗?

或者,如果在每个线程中创建 HttpClient 的实例,但显式释放连接管理器,会更好吗?

[方法B]

MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
      c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
    connman.shutdown();
}

connman.shutdown() 会遇到性能问题吗?

我可以知道对于使用 50++ 线程的应用程序,哪种方法(A 或 B)更好?


肯定是方法 A,因为它是池化且线程安全的。

如果您使用的是httpclient 4.x,则调用连接管理器ThreadSafeClientConnManager。看到这个link了解更多详细信息(向下滚动到“池连接管理器”)。例如:

    HttpParams params = new BasicHttpParams();
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, registry);
    HttpClient client = new DefaultHttpClient(cm, params);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多线程环境中使用 HttpClient 的最佳实践 的相关文章

随机推荐

  • 为什么我的 Rust 线​​程没有并行运行?

    我希望启动 X 线程 这将向代码中的指定服务器发出 X 请求 目前 我的应用程序正在等待每个线程和 X 请求完成 然后再启动下一个线程 我该如何去做这个异步 extern crate hyper extern crate time use
  • iOS 屏幕锁定时背景音频停止

    我正在尝试让我的音频应用程序在后台播放 到目前为止 我将 应用程序播放音频 添加到 info plist 中的 所需背景模式 中 并在启动声音生成器之前添加了以下代码 AudioSessionInitialize NULL kCFRunLo
  • 在 Android NDK 项目中包含 ICU

    我用 C 构建了一个库 希望使用 NDK 将其包含在我的 Android 应用程序中 但是 我的图书馆需要使用 ICU4C 我一直在尝试为 Android 编译 ICU 并且我在 SO 上查看了很多问题 但我仍然无法将 ICU 编译为 An
  • Xcode 4.3 如何使用 SVN 合并两个开发人员的故事板更改?

    我遇到一个问题 一个项目有多个开发人员处理同一个故事板文件 当开发人员将控制器添加到他们自己的故事板版本时 需要合并文件 当我在合并过程中查看纯文本格式的故事板时 我无法理解我应该接受哪些更改以及按什么顺序接受 是否有某种关于如何从同一故事
  • MEF = 可能会感到沮丧?

    UPDATE 当我尝试让 MEF 在我的应用程序中工作时 我遇到了越来越多的地方 我只是不明白为什么它没有在我期望的时候自动创建我的库 我认为这一切都回到了 Reed 所说的需要 MEF 来创造一切 现在 我有一个 XML 读取器类需要使用
  • 仅使用小于运算符测试等效性?

    假设我有两个 T 类型的文字 我想测试它们是否相等 但类型 T 仅实现了 小于 运算符 我怎样才能在 C 中测试这个 您可以通过几个 小于 比较和一个否定来模拟相等运算符 if t1 lt t2 t2 lt t1 printf t1 and
  • 以 tidyeval 方式删除列

    我想使用 dplyr gt 0 7 删除列向量 library dplyr data mtcars rem cols lt c wt qsec vs am gear carb head select mtcars paste0 rem co
  • 为什么此 WPF RoutedCommand 绑定上下文菜单项被禁用?

    我目前仍在摸索 WPF 并且无法弄清楚为什么此上下文菜单项被禁用
  • IdentityServer4 与外部提供商关联失败错误

    我正在尝试将 Ping Federate 集成为我的 IdentityServer4 实例的外部 OIDC 提供商 当我启动外部登录流程时 出现以下错误 System Exception Correlation failed at Micr
  • 在 .NET (C#) Web 服务中本机返回 XML?

    我意识到 NET 中的 SOAP Web 服务返回 Web 方法返回的任何对象的 XML 表示形式 但如果我想返回 XML 格式的数据 存储它的最佳对象是什么 我正在使用answer to 这个问题编写我的 XML 代码如下 XmlWrit
  • 使用 CsvHelper 可以将空格转换为可为空吗?

    我有一些非常蹩脚的 Csv 文件需要解析 我正在使用 CsvHelper 它运行得很棒 除了我有一些带有空格的行 通常我有一个双行 File 文本 SomeDouble 更多文本 好 1 23 好 不好 不好 如果我尝试将其映射到 publ
  • 用于去抖动(包括函数参数)的 Python 装饰器

    如何在 python 中编写一个去抖装饰器 它不仅对调用的函数进行去抖 而且对所使用的函数参数 函数参数组合进行去抖 去抖意味着在给定的时间范围内抑制对函数的调用 假设您在 1 秒内调用一个函数 100 次 但您只想允许该函数每 10 秒运
  • MySQLi 相对于 MySQL 的优势 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 与 MySQL 相比 使用
  • C 中的指针和数组有什么不同吗?

    我正在编写一个小型 C 程序来进行一些数字运算 它需要在函数之间传递数组 这些函数应该接受并返回指针 对吧 例如 这个 我知道这可能不是最有效的事情 int reverse int l int len int reversed malloc
  • Bootstrap 3.0:响应列重置文档部分

    嘿 如果您在 Bootstrap 3 0 文档中查看 响应列重置 副标题 它会显示以下内容 有了四层网格 您必然会遇到问题 在某些断点处 您的列不能完全清除 因为一层比另一层高 要解决此问题 请结合使用 clearfix 和我们的响应式实用
  • ASP.NET MVC 路由和静态数据(即图像、脚本等)

    如果我在 ASP NET MVC1 或 2 Web 应用程序中请求静态资源 例如 图像 javascript 文件或 css 文件 NET 框架是否会尝试查看如果请求与路由列表匹配 并且最终找不到它的控制器 eg 资源 Content Im
  • 如何在 PHP 中将日期时间转换为 ISO 8601

    我如何转换我的时间2010 12 30 23 21 46ISO 8601 日期格式 面向对象 这是推荐的方式 datetime new DateTime 2010 12 30 23 21 46 echo datetime gt format
  • 使用 go-template 内的范围检测数组中的最后一项

    这个程序简单地输出 1 4 2 但我想打印 1 4 2 正如您所看到的 逗号打印在数组的每个项目之后 package main import os import text template func main params map stri
  • 在Android中编辑文本时获取光标位置?

    我正在使用自定义 EditText 视图 我已经重写了 OnKeyUp 事件并且能够捕获 Enter 键按下 现在我的要求是 当用户输入文本 嗨 你好吗 然后将光标保留在 are 一词后面并按 Enter 键 我需要获取光标位置 以便在按下
  • 在多线程环境中使用 HttpClient 的最佳实践

    一段时间以来 我一直在多线程环境中使用 HttpClient 对于每个线程 当它发起连接时 都会创建一个全新的 HttpClient 实例 最近我发现 使用这种方法会导致用户打开的端口过多 并且大部分连接处于TIME WAIT状态 http