packagemainimport("fmt""time")funcmain(){exit:=make(chanbool)gofunc(){for{select{case<-exit:fmt.Println("Exit")returncase<-time.After(2*time.Second):fmt.Println("Monitoring")}}}()time.Sleep(5*time.Second)fmt.Println("Notify Exit")exit<-true//keep main goroutine alivetime.Sleep(5*time.Second)}
packagemainimport("context""fmt""time")funcfoo(ctxcontext.Context,namestring){gobar(ctx,name)// A calls Bfor{select{case<-ctx.Done():fmt.Println(name,"A Exit")returncase<-time.After(1*time.Second):fmt.Println(name,"A do something")}}}funcbar(ctxcontext.Context,namestring){for{select{case<-ctx.Done():fmt.Println(name,"B Exit")returncase<-time.After(2*time.Second):fmt.Println(name,"B do something")}}}funcmain(){ctx,cancel:=context.WithCancel(context.Background())gofoo(ctx,"FooBar")fmt.Println("client release connection, need to notify A, B exit")time.Sleep(5*time.Second)cancel()//mock client exit, and pass the signal, ctx.Done() gets the signal time.Sleep(3 * time.Second)time.Sleep(3*time.Second)}