为了账号安全,请及时绑定邮箱和手机立即绑定

当将单个 http 客户端用于多个 goroutine 时,在一个线程上编辑传输是否会影响

当将单个 http 客户端用于多个 goroutine 时,在一个线程上编辑传输是否会影响

Go
千万里不及你 2022-09-26 17:32:59
假设我的程序中有一个全局网络/http 客户端。在这个程序中,我有几个戈鲁丁向同一个全球客户提出请求。例如戈朗伪代码:package mainfunc editTransportAndFetch(c *http.Client) {    c.Transport = &http.Transport{        // Make some unique change here    }    c.Get("https://www.google.com")}func main() {    client := http.Client        // Spawns 10 processes    for i := 0; i < 10; i++ {        go editTransportAndFetch(client)    }}在这个伪代码示例中,我演示了生成 http 的 10 个进程。正在编辑传输。在本例中,正在进行相同的精确更改,因此干扰可能不是一个大问题。但是,无论如何,如果这些进程同时发生,则更新全局客户端传输的一个进程是否会干扰其他进程可能正在使用的传输?我的最终用例是,我希望有一个全球客户端,并且能够指定自定义 DialTLSContext,但仅适用于某些请求。我不希望使用 DialTLS 上下文的请求也可能同时运行。我担心如果我编辑网址。传输一个请求的客户端,它可能会干扰并导致另一个请求也使用 DialTLSContext,即使我不希望它这样做。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果在多个 goroutine 之间共享同一个客户端实例,并且从其中一个 goroutine 修改该客户端,则该行为是未定义的,因为它是数据争用。

如果要修改某些戈鲁廷的客户端,则无需使用单个客户端,并且可以为每个戈鲁廷创建一个新客户端。

如果要在 main 中配置一个客户端,并将其用作所有 goroutine 的模板,请按值传递客户端,而不是 ,因此该模板的副本将传递给每个 goroutine,并且每个 goroutine 将在其自己的副本上工作,在下面共享公共副本。如果将 设置为其他内容,则由于 是副本,因此它仍然是安全的。*clientTransportTransportClient

但是,如果您修改了实例中的某些内容(即 ),那又是一个争用条件。别这样。TransportRoundTripper


查看完整回答
反对 回复 2022-09-26
?
慕容3067478

TA贡献1773条经验 获得超3个赞

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

客户端对于多个戈鲁廷的并发使用是安全的。


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信