1 回答
TA贡献1773条经验 获得超3个赞
您可以使用带取消的上下文,并使用它让 go 例程知道它们应该停止。
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
wg := &sync.WaitGroup{}
wg.Add(1)
go func(ctx context.Context) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Println("context is done")
return
case <-time.After(time.Second):
fmt.Println("work")
}
}
}(ctx)
time.Sleep(time.Second * 5)
cancel()
wg.Wait()
https://go.dev/play/p/qe2oDppSnaF
这是一个示例,可以在您的用例上下文中更好地展示它。
type result struct {
err error
val int
}
rand.Seed(time.Now().UnixNano())
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
rchan := make(chan result, 5)
wg := &sync.WaitGroup{}
for i := 0; i < 5; i++ {
wg.Add(1)
go func(ctx context.Context) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Println("context is done")
return
case <-time.After(time.Second):
n := rand.Intn(100)
if n > 90 {
rchan <- result{err: fmt.Errorf("error %d", n)}
} else {
rchan <- result{val: n}
}
}
}
}(ctx)
}
go func() {
wg.Wait()
close(rchan)
}()
for res := range rchan {
if res.err != nil {
fmt.Println(res.err)
cancel()
break
} else {
fmt.Println(res.val)
}
}
https://go.dev/play/p/Z63n1h2A81o
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报