初级会员
  • 第 20964 位会员
  • sonoho
  • 2018-07-30 17:18:36
  • Offline
  • 20 66

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • #2 @fengweiqiang 以上实现的是超时时不执行log.Println(222),你指的业务逻辑不是log.Println(222),难道是time.sleep? Go语言并没有提供在一个goroutine中终止另一个goroutine的方法。只能通过通信让goroutine主动退出
  • ```go package main import ( "log" "time" ) func main() { cb := make(chan bool, 1) go func() { timer2 := time.NewTimer(time.Second * 5) select { case <-timer2.C: log.Println(222) cb <- true case <-cb: return } }() log.Println() timer := time.NewTimer(time.Second * 2) select { case <-timer.C: log.Println("time out") cb <- false case tmp := <-cb: log.Println(tmp) } time.Sleep(time.Second * 10) log.Println(123) } ```
  • 可以使用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 } ```