比如说,我为了更快的获得某个网页,同时发起了10个go程,分别通过不同的代理去抓取该网页,那么当我从某个go程获得返回后,就需要关闭其余9个以释放资源。
但是此时这9个go程,按照一般的写法,大概率是阻塞在http.Get或者类似的函数上,这个情况下,go程无法再从外部获取信息了———因为已经阻塞住了。
请问各位大兄弟,这种情况下程序逻辑要怎么写才能从外部关闭那9个go程?
可以使用http包func (*Request) WithContext函数,构建request时传入上下文,这样便可以在其中一个go程请求完成时,中断其他go程的请求
```go
package main
import (
"context"
"fmt"
"log"
"net/http"
"sync"
)
func main() {
multiple3()
}
func multiple3() {
wg := &sync.WaitGroup{}
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 10; i++ {
wg.Add(1)
go work3(ctx, "https://studygolang.com", cancel, wg)
}
wg.Wait()
}
func work3(ctx context.Context, u string, cancel context.CancelFunc, wg *sync.WaitGroup) {
defer wg.Done()
req, err := http.NewRequest(http.MethodGet, u, nil)
if err != nil {
log.Fatal(err)
}
req = req.WithContext(ctx)
rep, err := http.DefaultClient.Do(req)
if err != nil {
log.Println(err)
return
}
defer rep.Body.Close()
fmt.Println(rep.StatusCode)
cancel()
return
}
```
#2
更多评论