初级会员
  • 第 48543 位会员
  • panzhongke
  • 2020-02-23 10:17:05
  • Offline
  • 21 31

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 我也是这样理解,当协程里做了非常耗时或迟迟不能返回的阻塞操作。是没有办法中止的。
  • ```go package main import ( "sync" "time" "fmt" "context" ) func main() { var wg sync.WaitGroup start:=time.Now() ctx,cancel:=context.WithTimeout(context.Background(),2*time.Second) defer cancel() wg.Add(1) go func(){ defer wg.Done() for{ select { case <-time.After(1 * time.Second): fmt.Println("overslept") return case <-ctx.Done(): fmt.Println(ctx.Err()) // prints "context deadline exceeded" return default: fmt.Println("dowork") time.Sleep(3*time.Second) fmt.Println("workdone") return } } }() time.Sleep(1*time.Second) cancel() wg.Wait() fmt.Println(time.Since(start)) fmt.Println("end") } 运行... dowork workdone 3.0001716s end 成功: 进程退出代码 0. ``` 谢谢@polaris回复,我找了个context代码。测试结果还是没有符合预期。感觉根本原因是select是同步循环。对于阻塞没有办法控制。