Context是一个树,从父节点可以派生出子的Context,父节点取消后,所有相关连的子节点都会取消
ctx中存在一个2秒后的timer,返回一个channel用于计时,计时到点之后,<-ctx.Done() channel返回。
最后执行defer栈中的cancel,取消定时器
代码如下,
main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
"golang.org/x/net/context"
)
type Result struct {
r *http.Response
err error
}
func process() {
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(2)*time.Second)
defer cancel()
tr := &http.Transport{}
client := &http.Client{Transport: tr}
c := make(chan Result, 1)
req, err := http.NewRequest("GET", "http://www.baidu.com", nil)
if err != nil {
fmt.Println("http request failed, err: ", err)
return
}
go func() {
resp, err := client.Do(req)
pack := Result{r: resp, err: err}
c <- pack
}()
select {
case <-ctx.Done():
tr.CancelRequest(req)
res := <-c
fmt.Printf("Timeout, res= %v\n", res)
case res := <-c:
defer res.r.Body.Close()
out, _ := ioutil.ReadAll(res.r.Body)
fmt.Printf("Server Response: %s\n", out)
}
}
func main() {
process()
}
程序输出如下
有疑问加站长微信联系(非本文作者)