go net/http client 有些参数并不是并发安全的?

wnanbei · · 1776 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

在官方文档中有提到 `net/http` 是协程安全的,应该复用。 > 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. 但使用 `Client` 发起请求时,有一部分请求的设置是以函数或字段的方式放在 `Client` 的参数中的。例如 Proxy 代理、重定向检查、超时设置。要设置的话必须像以下这般设置: ```go func RedirectFunc(req *http.Request, via []*http.Request) error { if len(via) > 5 { err := &RedirectError{r} return WrapErr(err, "RedirectError") } return nil } client.CheckRedirect = RedirectFunc // 设置重定向 ``` 这样的话就会造成一个问题,在并发的过程中如果要更改重定向次数的话,就会有并发安全问题,设置 Proxy 代理和超时时间也有这个问题。 比如在这样一个假设情况中,我现在有 10000 个请求需要并发,每个请求需要设置不同的特定 Proxy 代理。那么这时候使用全局的 Client,在每个协程中更改 `client.CheckRedirect` 函数,然后发起请求,显然会有并发问题,发起请求时使用的并不一定是指定的那个 Proxy。 想了想解决的办法: 1. 每个请求新建一个 Client? 2. 把更改参数和请求一起加锁锁起来? 请问这种情况有靠谱的解决方法吗?

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1776 次点击  ∙  1 赞  
加入收藏 微博
8 回复  |  直到 2019-11-29 10:53:56
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传