golang协程优雅退出

golang 协程优雅退出的几种方式

一:context(上下文方式)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
defer cancel()
timer := time.NewTimer(time.Duration(time.Millisecond * 900))
go func(ctx context.Context) {
fmt.Println(123)
}(ctx)
select {
case <-ctx.Done():
timer.Stop()
timer.Reset(time.Second)
fmt.Println(“call successfully!!!”)
return
case <-timer.C:
fmt.Println(“timeout!!!”)
return
}
}

二: channel 方式

func AsyncCall(ch chan interface{}) {
fmt.Println(13)
ch <- struct{}{}
}

func main() {
ch := make(chan interface{}, 0)
go AsyncCall(ch)
select {
case <-ch:
fmt.Println(“123”)
case <-time.After(4 * time.Second):
fmt.Println(“456”)
}

}

你可能感兴趣的:(golang)