Go http客户端超时与上下文超时
Go http client timeout vs context timeout
http.Client 中设置的超时与请求上下文中设置的超时有什么区别?
我见过 2 种在 http 客户端中设置超时的方法。
第一个:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8080", nil)
第二个:
client := http.Client{
Timeout: 2 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
什么时候用一个代替另一个?
通常情况下,当我们只想为一个 http 请求设置超时时,我们会使用这种方法
client := http.Client{
Timeout: 2 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
我认为问题是我们什么时候应该使用上下文,如果你去看文档你会发现
Package context defines the Context type, which carries deadlines,
cancellation signals, and other request-scoped values across API
boundaries and between processes.
所以假设你有一个 API 需要在一段时间内做出响应,你需要一种方法来跟踪它创建的所有 go 例程,并希望同时向它们发出停止信号;这是一个使用上下文并将其传递给由一个 API 调用创建的所有 go 例程的用例,并且很容易知道上下文何时过期以及何时每个人都需要停止工作。
虽然您执行 http 请求的方式可行,但创建对特定请求明确的上下文没有多大意义,除非可以说您的请求是 运行 在 goroutine 中并且您需要由于执行后收到的一些其他输入而传递取消信号。
理想情况下,在大多数情况下,上下文用于确定您需要发出信号的请求链/goroutines 的范围。
您应该阅读此内容以更清楚地了解何时使用上下文
https://blog.golang.org/context
两者都可以实现同样的事情,就是超时终止请求
但是使用上下文是首选方式,因为它是为此任务而设计的。在将上下文添加到 Go 之前字段超时存在。您必须在创建请求时选择一个超时,因为请求将选择要应用的较小超时,从而使其他超时无效。在这种情况下,更好的方法是使用上下文超时,因为您可以更好地控制它,您可以使用取消而不指定超时,以防您希望通过逻辑决策取消请求。使用上下文,您还可以通过它传递描述请求范围值的任何值。
使用上下文是特定于请求的,而使用客户端超时可能适用于传递给客户端具有的 Do
方法的所有请求。如果您想将 deadline/timeout 专门用于每个请求,则使用上下文,否则如果您希望每个出站请求有 1 个超时,则使用客户端超时就足够了。
您也可以在这里阅读
http.Client 中设置的超时与请求上下文中设置的超时有什么区别?
我见过 2 种在 http 客户端中设置超时的方法。
第一个:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8080", nil)
第二个:
client := http.Client{
Timeout: 2 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
什么时候用一个代替另一个?
通常情况下,当我们只想为一个 http 请求设置超时时,我们会使用这种方法
client := http.Client{
Timeout: 2 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
我认为问题是我们什么时候应该使用上下文,如果你去看文档你会发现
Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes.
所以假设你有一个 API 需要在一段时间内做出响应,你需要一种方法来跟踪它创建的所有 go 例程,并希望同时向它们发出停止信号;这是一个使用上下文并将其传递给由一个 API 调用创建的所有 go 例程的用例,并且很容易知道上下文何时过期以及何时每个人都需要停止工作。
虽然您执行 http 请求的方式可行,但创建对特定请求明确的上下文没有多大意义,除非可以说您的请求是 运行 在 goroutine 中并且您需要由于执行后收到的一些其他输入而传递取消信号。
理想情况下,在大多数情况下,上下文用于确定您需要发出信号的请求链/goroutines 的范围。
您应该阅读此内容以更清楚地了解何时使用上下文 https://blog.golang.org/context
两者都可以实现同样的事情,就是超时终止请求
但是使用上下文是首选方式,因为它是为此任务而设计的。在将上下文添加到 Go 之前字段超时存在。您必须在创建请求时选择一个超时,因为请求将选择要应用的较小超时,从而使其他超时无效。在这种情况下,更好的方法是使用上下文超时,因为您可以更好地控制它,您可以使用取消而不指定超时,以防您希望通过逻辑决策取消请求。使用上下文,您还可以通过它传递描述请求范围值的任何值。
使用上下文是特定于请求的,而使用客户端超时可能适用于传递给客户端具有的 Do
方法的所有请求。如果您想将 deadline/timeout 专门用于每个请求,则使用上下文,否则如果您希望每个出站请求有 1 个超时,则使用客户端超时就足够了。
您也可以在这里阅读