V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ben548
V2EX  ›  Go 编程语言

golang 发起 http 请求的时候,设置 header 头的操作是线程安全的吗?

  •  
  •   ben548 · 327 天前 · 1831 次点击
    这是一个创建于 327 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有如下代码:
    req, _ := http.NewRequest("POST", "http://example.com", nil)
    req.Header.Set("Content-Type", "application/json")
    追了一下 golang 源码 header 是 map[string][]string 类型,
    set 方法的源码是:
    func (h Header) Set(key, value string) {
    textproto.MIMEHeader(h).Set(key, value)
    }
    看上去,在做 header set 的时候,golang 并没有做加锁解锁等操作。
    我还去看了下 resty 请求库和 gorequest 请求库,发现实现方式和 go 原生的是一样的。

    我的需求:要并发发起 http post 请求,每个请求需要设置不同的 auth header 头
    我的疑问:
    1 、在设置 header 的时候是否存在 map 并发读写的问题?
    2 、在并发发起 http post 请求的时候,request 是共用一个,还是每次发起都 new 一个?
    8 条回复    2023-05-29 10:08:10 +08:00
    hsfzxjy
        1
    hsfzxjy  
       327 天前 via Android
    request 显然是每次都 new 一个
    leonshaw
        2
    leonshaw  
       327 天前
    1. 存在
    2. 可以 new 一个模版然后 Clone
    zlstone
        3
    zlstone  
       327 天前
    都是 new 一个新的
    shawn4me
        4
    shawn4me  
       327 天前
    同意一楼, 看你代码实现是 new 一个 request 后通过多个 goroutine 修改这个 request 来实现多个请求并发,还是每个请求都 new 一个 request , 后者每个 request 都是独立的所以并不会出现并发问题,前者的话不建议你这么做。
    admpubcom
        5
    admpubcom  
       327 天前 via iPhone
    在设计上就不是让你共享 request 的,那不是正确的使用方式。每次请求就是一个独立的 request 。
    lasuar
        6
    lasuar  
       327 天前
    你这本身就是个骚操作,设计上不考虑这种情况,所以。
    SingeeKing
        7
    SingeeKing  
       326 天前 via iPhone
    这不应该直接看下源码吗…

    凭我的印象 http.Client Do 里面最初就直接 copy headers 了,也就是在这一步之间进行修改的话确实会 panic
    wangritian
        8
    wangritian  
       326 天前
    你不会开多线程拼 header 吧[狗头]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2786 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:18 · PVG 21:18 · LAX 06:18 · JFK 09:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.