golang实现协程之间的调用栗子
题目:
有一个独立的do方法输出“do”的字样, 有3个协程;A协程里触发B协程输出10次do字样,随后B协程告诉A协程做完10次输出,接着A协程输出一次do字样,接着A协程触发C协程关闭B协程,随后C协程关闭, A协程关闭。
package main import ( "context" "fmt" "sync" "time" ) func main() { aChan := make(chan int) bChan := make(chan int) cChan := make(chan int) defer func() { close(aChan) close(bChan) close(cChan) }() ctx := context.Background() ctxA, cancelA := context.WithCancel(ctx) ctxB, cancelB := context.WithCancel(ctx) ctxC, cancelC := context.WithCancel(ctx) wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() for { select { case <-time.After(time.Second * 2): bChan <- 10 case <-aChan: do("A") cancelA() case <-ctxA.Done(): cancelC() fmt.Println("A done") return } } }() wg.Add(1) go func() { defer wg.Done() for { select { case n := <-bChan: for i := 0; i < n; i++ { do("B") } aChan <- 1 case <-ctxB.Done(): fmt.Println("B done ") return } } }() wg.Add(1) go func() { defer wg.Done() for { select { case <-ctxC.Done(): cancelB() fmt.Println("C done ") return } } }() wg.Wait() } func do(s string) { fmt.Println(s, "do") }
上一篇:
IDEA上Java项目控制台中文乱码