1 回答
TA贡献1789条经验 获得超10个赞
goroutine 执行默认分支两次,并在发送到 时阻止。不执行该案例,因为 goroutine 卡在默认分支中。c<-ctx.Done()
通过从选择事例而不是分支语句发送来解决此问题。
func A(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("killing AAAA")
return // kill A at least
case c <- "yesss":
fmt.Println("in A1.. .. again")
}
}
}
您可能看不到单独具有此更改的,因为程序可以在 goroutine 运行完成之前退出。killing AAAA
等待 goroutine 完成以查看消息:
var wg sync.WaitGroup
func A(ctx context.Context) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Println("killing AAAA")
return // kill A at least
case c <- "yesss":
fmt.Println("in A1.. .. again")
}
}
}
...
wg.Add(1)
go A(ctx)
time.Sleep(2 * time.Second)
valueReceived := <-c
cancel()
wg.Wait()
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报