Go中http.Transport与http.Client是否支持并发修改?
http.Client的并发安全性说明 核心结论
http.Client支持被多个goroutine并发调用其方法(如Do()、Get()),这也是官方推荐复用Client的核心原因。http.Client不支持并发修改其字段,并发修改会引发数据竞争,导致不可预期的行为。
官方文档依据
// The Client's Transport typically has internal state (cached TCP
// connections), so Clients should be reused instead of created as
// needed. Clients are safe for concurrent use by multiple goroutines.
这段文档里的"safe for concurrent use"特指并发调用Client的方法是安全的,因为其内部的Transport(默认是http.Transport)已经做了并发同步处理,能安全管理连接池等内部状态。
针对你的场景说明
你要基于单个http.Client并发执行20000个不同参数的http.Request,只要满足以下条件,就是完全安全的:
- 只调用
http.Client的方法(如Do(req))发起请求,不修改该Client的任何字段(比如Timeout、Transport等)。 - 每个请求使用独立的
http.Request实例(你已经提到是不同参数的请求,通常自然满足这点)。
内容的提问来源于stack exchange,提问作者Colduction
相关产品推荐
相关产品推荐

