【问题标题】:Golang goroutine-safe http client with different timeout?具有不同超时的Golang goroutine-safe http客户端?
【发布时间】:2015-07-13 21:49:28
【问题描述】:

假设我有以下功能:

func SendRequest(c *Client, timeout time.Duration) {
  if timeout > 0 {
    c.Timeout = timeout
  } else {
    c.Timeout = defaultTimeout
  }
  ...
}

我想允许多个 go-routine 调用这个函数(共享同一个 HTTP 客户端),但是这样的写法显然不能保证 goroutine 的安全。 (另外更改传入的客户端的超时时间也很奇怪......)

我不确定最好的方法是什么。我应该为不同的超时使用不同的客户端吗?我应该使用一些互斥锁吗?或者一般而言,我如何共享具有不同超时的 HTTP 客户端?

谢谢!

【问题讨论】:

    标签: go goroutine


    【解决方案1】:

    您需要使用不同的客户端。即使您使用互斥锁保护您的函数,您也无法保护客户端的内部访问,并且另一个 goroutine 可能会在发出请求时更改它。

    多个客户端仍然可以共享同一个传输,如果您不指定一个,它们都将使用 DefaultTransport。

    【讨论】:

    • 那么对于 Go 中的 HTTP,哪一部分是昂贵的,所以我们应该尽可能地重用,如果有的话,为什么?
    • @Danqing:“哪部分贵”是什么意思?客户和运输——您所说的“昂贵”是什么意思?一切都是有代价的,所以尽可能重复使用。例如,传输是处理连接的地方,因此使用单个传输会增加重用连接的可能性。
    • 这是正确的吗?来自net/http 文档:“客户端和传输对于多个 goroutine 并发使用是安全的,并且为了提高效率,应该只创建一次并重复使用。”
    • @mjturner,可以同时使用一个客户端,但是不能同时修改。
    • @JimB 啊,明白了 - 有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2023-04-10
    • 2020-07-04
    • 2016-10-10
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多