package main
import (
"fmt"
"time"
)
func main() {
N := 10
exit := make(chan struct{})
done := make(chan struct{}, 10)
for i := 0; i < N; i++ {
go func(n int) {
for {
select {
// 每个协程都在等待exit信号
case <-exit:
fmt.Printf("worker goroutine # %d exit\n", n)
// 收到exit信号后, 往done中写入数据
done <- struct{}{}
return
// 每秒都会发生
case <-time.After(time.Second):
fmt.Printf("worker goroutine # %d is working...\n", n)
}
}
}(i)
}
// 主协程等待10s
time.Sleep(3 * time.Second)
// 主协程发送exit信号,这样每个goroutine都会收到exit信号
close(exit)
for i := 0; i < N; i++ {
<-done
}
fmt.Println("main goroutine exit")
}
/*
worker goroutine # 4 is working...
worker goroutine # 2 is working...
worker goroutine # 5 is working...
worker goroutine # 8 is working...
worker goroutine # 0 is working...
worker goroutine # 7 is working...
worker goroutine # 1 is working...
worker goroutine # 9 is working...
worker goroutine # 6 is working...
worker goroutine # 3 is working...
worker goroutine # 8 is working...
worker goroutine # 2 is working...
worker goroutine # 4 is working...
worker goroutine # 5 is working...
worker goroutine # 6 is working...
worker goroutine # 7 is working...
worker goroutine # 0 is working...
worker goroutine # 3 is working...
worker goroutine # 9 is working...
worker goroutine # 1 is working...
worker goroutine # 8 exit
worker goroutine # 3 exit
worker goroutine # 6 exit
worker goroutine # 5 exit
worker goroutine # 7 exit
worker goroutine # 1 exit
worker goroutine # 0 exit
worker goroutine # 9 exit
worker goroutine # 2 exit
worker goroutine # 4 exit
main goroutine exit
*/
一个协程向其它协程发送通知
猜你喜欢
转载自blog.csdn.net/themagickeyjianan/article/details/106981761
今日推荐
周排行