在并发应用程序中使用 HTTP 客户端的最佳方式

Posted

技术标签:

【中文标题】在并发应用程序中使用 HTTP 客户端的最佳方式【英文标题】:Best way to use HTTP client in a concurrent application 【发布时间】:2016-08-14 21:42:57 【问题描述】:

首先我将描述我的情况。 我必须从我的应用程序向多个 API 发出 HTTPS 请求,并且它们应该同时运行。 我想知道是否应该为每个 goroutine 使用一个单独的 HTTP 客户端,或者我可以在所有 goroutine 之间共享一个客户端。当然,我想享受 HTTP 客户端提供的连接重用/池化,但我担心它是线程(又名 goroutine)安全的,并且客户端是否会同时运行请求或者它们实际上会被排序?

【问题讨论】:

有些相关:How to release http.Client in Go? 【参考方案1】:

根据文档 (https://golang.org/src/net/http/client.go),Http 客户端是线程安全的:

多个 goroutine 并发使用客户端是安全的。

【讨论】:

goroutine 这么多,单个客户端会不会成为瓶颈?? 是的,同样的问题,如果有 1000 个 goroutine 使用单个全局客户端变量怎么办? @user4867444 请您向我们解释一下:为什么它不会成为瓶颈? 只是因为它没有任何锁 @user4867444 - 首先,这个问题是完全合理的。其次,SO 是一个提问的地方,人们帮助他人了解这些事情是如何运作的。第三,您可能不明白这是如何工作的,因为 http.Client 中有 锁。 RoundTripper 是一个接口,默认使用http.Transport。这有atleast 3 mutexes 而无需进入更多子字段。接下来,cookie jar - http.Jar,再次......有一个互斥锁。实际上有多个锁,这个问题不仅有效,而且完全有可能在这里出现问题。【参考方案2】:

另一个问题是您应该使用一个客户端还是每个请求一个客户端。你应该使用一个客户端 https://pkg.go.dev/net/http#pkg-overview

“客户端和传输对于多个 goroutine 并发使用是安全的,并且为了提高效率,应该只创建一次并重复使用”

【讨论】:

以上是关于在并发应用程序中使用 HTTP 客户端的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net:将数据从 WCF 服务广播到 Asp.Net 客户端的最佳方式

在网页中嵌入 IRC 客户端的最佳方式

将实时 http 流式传输到 HTML5 视频客户端的最佳方法 [关闭]

如何用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

Python 脚本与将内容传输到客户端的 Python Flask 服务器通信的最佳方式是啥?

启用缓存时模拟服务人员和 Apollo 客户端的最佳实践