gpt4 book ai didi

go - 来自上下文的完成信号如何帮助取消请求?

转载 作者:行者123 更新时间:2023-12-01 21:12:25 27 4
gpt4 key购买 nike

这是来自golang上下文页面https://blog.golang.org/context的代码段

func httpDo(ctx context.Context, req *http.Request, f func(*http.Response, error) error) error {
// Run the HTTP request in a goroutine and pass the response to f.
c := make(chan error, 1)
req = req.WithContext(ctx)
go func() { c <- f(http.DefaultClient.Do(req)) }()
select {
case <-ctx.Done():
<-c // Wait for f to return.
return ctx.Err()
case err := <-c:
return err
}
}
此方法的说明说

httpDo函数运行HTTP请求并在新的goroutine中处理其响应。如果在goroutine退出之前ctx.Done关闭,它将取消请求:

在这里如何取消请求?我看到它的方式,即使上下文已完成,我们仍在等待请求的结果?这有什么帮助?

最佳答案

取消上下文后,Do(req)将退出并显示错误。没错,我们仍在等待c中的值,但是我们应该在上下文取消后立即获取它。另外,不必等待Do(req)的完成。根据您的用例,可以尽早从函数中返回。
当然,随机func Foo(ctx context.Context)函数将不必侦听上下文,因此,假设所有采用上下文的函数将正确处理取消操作是不安全的。您应该根据文档和/或代码行事。

关于go - 来自上下文的完成信号如何帮助取消请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63484001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com