用来处理请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。
package main
import (
"context"
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
//当子goroutine又开启另外一个goroutine时,只需要将ctx
func worker2(ctx context.Context){
LOOP:
for{
fmt.Println("worker2")
time.Sleep(time.Second)
select {
case <-ctx.Done(): //等待上级通知
break LOOP
default:
}
}
}
func worker(ctx context.Context){
go worker2(ctx)
LOOP:
for{
fmt.Println("worker")
time.Sleep(time.Second)
select{
case <-ctx.Done(): //等待上级通知
break LOOP
default:
}
}
wg.Done()
}
func main() {
ctx,cancel:=context.WithCancel(context.Background())
wg.Add(1)
go worker(ctx)
time.Sleep(time.Second*6)
cancel() //通知子goroutine结束
wg.Wait()
fmt.Println("over")
}