type favContextKey string
func main() {
wg := &sync.WaitGroup{}
values := []string{"https://www.baidu.com", "https://www.zhihu.com"}
ctx, cancelFunc := context.WithCancel(context.Background())
for _, value := range values {
wg.Add(1)
subCtx := context.WithValue(ctx, favContextKey("url"), value)
go reqUrl(subCtx, wg)
}
go func() {
time.Sleep(time.Second * 3)
cancelFunc()
}()
wg.Wait()
fmt.Println("exit main goroutine")
}
func reqUrl(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
url, _ := ctx.Value(favContextKey("url")).(string)
for {
select {
case <-ctx.Done():
fmt.Printf("stopping getting url %s\n", url)
return
default:
get, err := http.Get(url)
if get.StatusCode == http.StatusOK && err == nil {
all, _ := ioutil.ReadAll(get.Body)
subCtx := context.WithValue(ctx, favContextKey("resp"),fmt.Sprintf("%s%x",url, md5.Sum(all)))
wg.Add(1)
go showResp(subCtx,wg)
}
get.Body.Close()
time.Sleep(time.Second)
}
}
}
func showResp(ctx context.Context,wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Println("stop showing resp")
return
default:
fmt.Println("printing: ", ctx.Value(favContextKey("resp")))
time.Sleep(time.Second)
}
}
}