如何解决来自上下文的完成信号如何帮助取消请求?
这是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中处理其响应。如果ctx.Done在goroutine退出之前关闭,它将取消请求:
在这里如何取消请求?我看到它的方式,即使上下文已完成,我们仍在等待请求的结果?这有什么帮助?
解决方法
mapLeftOrRight :: (a -> c) -> (b -> d) -> Either a b -> Either c d
mapLeftOrRight fa fb = either (Left . fa) (Right . fb)
将会错误退出。没错,我们仍在等待Do(req)
中的值,但是我们应该在上下文取消之后立即获取它。另外,也不必等待c
的完成。可以根据您的用例尽早从函数中返回。
当然,随机Do(req)
函数不必侦听上下文,因此,假设所有带有上下文的函数将正确处理取消操作是不安全的。您应该根据文档和/或代码行事。
诀窍是使用http.DefaultClient.Do(req)
将上下文传递给req = req.WithContext(ctx)
,因此req
参数将上下文保留在内部。函数http.DefaultClient.Do()
使用它,并且在取消原始上下文(ctx
)后将退出。
实际上我不会说“ httpDo函数取消了请求”,它是由ctx
的调用者通过httpDo
取消的。在这里使用goroutine是有争议的,我们只需返回f(http.DefaultClient.Do(req))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。